JShell은 Java 언어를 학습하고 Java 코드를 빠르게 프로토타이핑할 수 있도록 도와주는 대화형(Interactive) 도구입니다. REPL(Read-Evaluate-Print-Loop) 방식으로 동작하며, 선언문·문장·표현식을 입력하는 즉시 평가하고 그 결과를 화면에 바로 출력해 줍니다. 이 도구는 별도의 IDE 없이 명령줄(Command-line) 프롬프트에서 실행할 수 있습니다.
최상위 선언에서 허용되지 않는 한정자
JShell의 최상위(Top-level) 선언에는 public, protected, private, static, final과 같은 한정자를 사용할 수 없습니다. 이러한 한정자를 입력하면 컴파일 오류가 발생하지 않고, 경고(Warning) 메시지와 함께 자동으로 무시됩니다.
반면 synchronized, native, abstract, default 키워드를 최상위 메서드에 사용하면 단순히 무시되지 않고 오류(Error)로 처리됩니다.
아래 예제에서는 final 변수와 static 변수를 각각 선언했습니다. 두 경우 모두 "Modifier 'final'/'static' not permitted in top-level declarations, ignored(최상위 선언에서는 해당 한정자가 허용되지 않아 무시됨)"라는 경고 메시지가 출력되는 것을 확인할 수 있습니다.
예제 1 - final 변수 선언
C:\Users\User\>jshell | Welcome to JShell -- Version 9.0.4 | For an introduction type: /help intro jshell> final int x = 0 | Warning: | Modifier 'final' not permitted in top-level declarations, ignored | final int x = 0; | ^---^ x ==> 0 jshell> x = 1 x ==> 1
위 실행 결과를 보면 final로 선언했음에도 불구하고 변수 x에 새로운 값 1이 정상적으로 할당되었습니다. 즉, JShell은 final 한정자를 무시했기 때문입니다.
예제 2 - static 변수 선언
jshell> static String str = "Tutorix" | Warning: | Modifier 'static' not permitted in top-level declarations, ignored | static String str = "Tutorix"; | ^----^ str ==> "Tutorix"
마찬가지로 static 한정자를 사용한 문자열 변수 선언 역시 경고만 출력될 뿐, 변수 자체는 정상적으로 생성되어 값을 담고 있습니다.
정리
JShell은 학습과 실험을 위한 도구이기 때문에 클래스 구조 없이 코드를 자유롭게 작성할 수 있도록 설계되었습니다. 따라서 최상위 선언에서 의미가 없는 public, private, static, final 같은 한정자는 경고와 함께 무시되며, synchronized, native, abstract, default처럼 문법적으로 부적합한 키워드는 오류로 처리된다는 점을 기억하면 됩니다.