JShell이란 무엇인가?
JShell은 Java 9부터 도입된 명령줄(command-line) 도구입니다. 간단한 단일 문장부터 복합 문장, 나아가 완전한 형태의 메서드나 클래스까지 Java 코드를 직접 입력할 수 있으며, 입력된 코드를 즉시 평가(evaluate)하고 그 결과를 화면에 출력해 줍니다. 덕분에 별도의 컴파일 과정 없이도 Java 코드를 대화형으로 빠르게 실험하고 학습할 수 있는 REPL(Read-Eval-Print Loop) 환경을 제공합니다.
정방향 참조(Forward Reference)의 개념
정방향 참조란, 아직 JShell에 입력되지 않은 — 즉 현재 시점에 존재하지 않는 — 메서드, 변수, 또는 클래스를 가리키는 코드를 의미합니다. JShell은 사용자가 입력한 코드를 입력된 순서대로 순차적으로 평가하기 때문에, 이러한 정방향 참조는 일시적으로 해결되지 않은(unresolved) 상태로 유지됩니다.
JShell은 다음과 같은 위치에서 정방향 참조를 지원합니다.
- 메서드 본문(method body)
- 반환 타입(return type)
- 매개변수 타입(parameter type)
- 변수 타입(variable type)
- 클래스 내부(within a class)
정방향 참조 예제 1: 아직 선언되지 않은 변수 호출
아래 코드 스니펫에서는 JShell에 forwardReference()라는 메서드를 생성했습니다. 이 메서드는 내부에서 아직 선언되지 않은 변수를 참조하고 있기 때문에, 해당 변수가 선언되기 전에는 호출할 수 없습니다. 실제로 메서드 호출을 시도하면 다음과 같은 경고 메시지가 출력됩니다.
C:\Users\User>jshell
| Welcome to JShell -- Version 9.0.4
| For an introduction type: /help intro
jshell> void forwardReference() {
...> System.out.println(notYetDeclared);
...> }
| created method forwardReference(), however, it cannot be invoked until variable notYetDeclared is declared
jshell> forwardReference()
| attempted to call method forwardReference() which cannot be invoked until variable notYetDeclared is declared
출력된 메시지를 보면, 메서드 자체는 성공적으로 생성되었지만 "notYetDeclared" 변수가 선언되기 전까지는 호출할 수 없다는 안내가 표시됩니다. 이것이 바로 JShell이 정방향 참조를 허용하면서도, 실행 시점에는 안전하게 제어하는 방식입니다.
정방향 참조 예제 2: 변수 선언 후 정상 호출
이번에는 앞서 참조했던 "notYetDeclared" 변수를 문자열 값을 갖도록 선언합니다. 변수 선언이 완료된 후 forwardReference() 메서드를 다시 호출하면, 더 이상 경고 없이 정상적으로 실행되어 "variable is declared"라는 결과가 출력됩니다.
jshell> String notYetDeclared = "variable is declared" notYetDeclared ==> "variable is declared" jshell> forwardReference() variable is declared
정리
JShell의 정방향 참조 기능을 활용하면, 아직 구현하지 않은 메서드나 변수를 먼저 작성해 두고 나중에 필요한 요소를 순차적으로 선언해 나가는 유연한 개발 흐름을 만들 수 있습니다. 다만 참조 대상이 선언되기 전에는 해당 코드를 실행할 수 없으므로, 프로토타이핑 단계에서 코드 작성 순서를 유연하게 조정하는 용도로 유용하게 활용할 수 있습니다.