결론부터 말하면, 불가능합니다. 자바에서 최상위(top-level) 클래스는 private이나 protected로 선언할 수 없습니다. 사용할 수 있는 접근 수준은 public과 default(접근 제어자 생략) 두 가지뿐이며, 접근 제어자를 명시하지 않으면 기본적으로 default(패키지) 접근 권한을 갖게 됩니다.
기본 문법
// 최상위 클래스
public class TopLevelClassTest {
// 클래스 본문
}
핵심 포인트 정리
- 최상위 클래스를 private으로 선언하면 컴파일러가 "modifier private is not allowed here"(여기서는 private 제어자가 허용되지 않음)라는 오류를 발생시킵니다. 즉, 최상위 클래스는 private이 될 수 없으며, protected도 마찬가지입니다.
- protected는 같은 패키지 내의 모든 클래스와, 다른 패키지에 속한 하위(sub) 클래스까지도 멤버에 접근할 수 있도록 허용하는 제어자입니다.
- 최상위 클래스에 허용되는 제어자는 public, abstract, final뿐이며, 아무런 클래스 제어자도 붙이지 않는 것도 가능합니다. 이를 default/package 접근성이라고 부릅니다.
- 내부(inner) 클래스는 private 또는 protected로 선언할 수 있지만, 외부(outer) 클래스에는 적용할 수 없습니다.
- 하나의 자바 소스 파일에 여러 개의 최상위 클래스를 정의할 수 있지만, public 최상위 클래스는 최대 하나만 존재할 수 있으며, 파일 이름은 반드시 public 클래스의 이름과 일치해야 합니다.
protected로 클래스 선언하기
예제
protected class ProtectedClassTest {
int i = 10;
void show() {
System.out.println("Declare top-level class as protected");
}
}
public class Test {
public static void main(String args[]) {
ProtectedClassTest pc = new ProtectedClassTest();
System.out.println(pc.i);
pc.show();
System.out.println("Main class declaration as public");
}
}
위 예제처럼 클래스를 protected로 선언하면 컴파일 단계에서 "modifier protected not allowed here" 오류가 발생하여 코드가 실행되지 않습니다.
출력 결과
modifier protected not allowed here
private으로 클래스 선언하기
예제
private class PrivateClassTest {
int x = 20;
void show() {
System.out.println("Declare top-level class as private");
}
}
public class Test {
public static void main(String args[]) {
PrivateClassTest pc = new PrivateClassTest();
System.out.println(pc.x);
pc.show();
System.out.println("Main class declaration as public");
}
}
마찬가지로 클래스를 private으로 선언하면 "modifier private not allowed here" 오류가 발생하여 코드가 실행되지 않습니다.
출력 결과
modifier private not allowed here
왜 최상위 클래스에는 private과 protected가 허용되지 않을까?
private은 같은 클래스 내부에서만 접근을 허용하는 제어자입니다. 만약 최상위 클래스가 private으로 선언되면 그 클래스는 외부 어디에서도 인스턴스화하거나 참조할 수 없게 되어 사실상 존재 의미가 없어집니다.
protected 역시 상속 관계와 패키지 구조를 전제로 동작하는 제어자이기 때문에, 패키지 계층 바깥에 독립적으로 존재하는 최상위 클래스에는 적합하지 않습니다. 이러한 언어 설계상의 이유로 자바는 최상위 클래스에 대해 public과 default 두 가지만 허용하고 있습니다.