Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java 9 JShell 외부 선언(External Declarations) 규칙 완벽 가이드

JShell이란 무엇인가?

JShellJava 9에서 처음 도입된 명령줄 도구(command-line tool)로, Java 역사상 최초의 공식 REPL(Read-Eval-Print Loop) 도구입니다. 사용자가 입력한 코드를 즉시 읽고(read), 평가하고(evaluate), 결과를 출력(print)하는 간단한 프로그래밍 환경을 제공하여, 별도의 클래스 파일 작성이나 컴파일 과정 없이도 코드를 빠르게 테스트하고 학습할 수 있습니다.

일반적인 Java 프로그램과 달리, JShell에서는 클래스나 인터페이스 외부에서 직접 변수, 메서드, 클래스를 선언할 수 있습니다. 이러한 최상위(top-level) 선언에는 일반 Java 코드와 다른 특별한 규칙이 적용됩니다.

외부 선언(External Declarations)의 핵심 규칙

1) 접근 제한자(public, protected, private)는 무시됩니다

JShell에서는 접근 제한자를 명시해도 무시되며, 모든 선언 스니펫(snippet)은 서로 자유롭게 접근할 수 있습니다. 이는 REPL 환경에서 코드 간 상호작용을 단순화하기 위한 설계입니다.

jshell> private int i = 10;
i ==> 10

jshell> System.out.println(i);
10

위 예제에서 private으로 선언했음에도 불구하고, 이후 스니펫에서 변수 i에 정상적으로 접근할 수 있는 것을 확인할 수 있습니다.

2) final 제한자는 무시됩니다

final 제한자가 붙은 선언도 마찬가지로 무시되며, 값의 변경과 클래스의 상속이 모두 허용됩니다. 대신 JShell은 아래와 같이 경고 메시지를 출력합니다.

jshell> final class A {void m() {} }
|   Warning:
|   Modifier 'final' not permitted in top-level declarations, ignored
|   final class A {void m() {} }
|   ^---^
|   created class A

3) static 제한자는 무시됩니다

JShell에는 선언을 감싸는 컨테이너 클래스(container class)가 존재하지 않기 때문에, static 제한자는 의미가 없으며 무시됩니다.

jshell> static char letter = 'A';
|   Warning:
|   Modifier 'static' not permitted in top-level declarations, ignored
|   static char letter = 'A';
|   ^----^
letter ==> 'A'

4) default와 synchronized 제한자는 허용되지 않습니다

defaultsynchronized 제한자는 최상위 선언에서 아예 사용이 금지되며, 사용 시 경고가 아닌 오류(Error)가 발생합니다.

jshell> synchronized void method() {}
|   Error:
|   Modifier 'synchronized' not permitted in top-level declarations
|   synchronized void method() {}
|   ^----------^

5) abstract 제한자는 클래스에서만 허용됩니다

abstract 제한자는 클래스 선언에만 사용할 수 있으며, 메서드 등 다른 최상위 선언에는 적용할 수 없습니다.

jshell> abstract void method();
|   Error:
|   Modifier 'abstract' not permitted in top-level declarations
|   abstract void method();
|   ^------^

정리

JShell의 외부 선언 규칙을 요약하면 다음과 같습니다.

  • public, protected, private: 무시됨 — 모든 스니펫 간 자유로운 접근 가능
  • final: 무시됨 — 값 변경 및 상속 허용
  • static: 무시됨 — 컨테이너 클래스가 없기 때문
  • default, synchronized: 사용 금지 — 오류 발생
  • abstract: 클래스 선언에만 허용

이러한 규칙들은 JShell이 학습과 실험에 최적화된 경량 REPL 환경을 제공하기 위한 설계 철학을 반영한 것입니다. 일반 Java 애플리케이션 개발 시에는 기존의 접근 제어 규칙이 그대로 적용된다는 점을 기억하세요.