A top level class is a class that is not a nested class.
A nested class is any class whose declaration occurs within the body of another class or interface.
톱레벨 클래스란 중첩 클래스가 아닌 클래스이다. 보통 우리가 사용하는 파일 내에 하나만 존재하는 클래스를 톱레벨 클래스라고 한다.
중첩클래스는 다른 클래스 안에 정의된 클래스이다.
왜 톱레벨 클래스는 한 파일에 하나만 담아야 할까?
- 자바 컴파일러는 소스 파일 하나에 톱레벨 클래스를 여러개 선언하는 것을 막지 않는다.(하지만 심각한 위험 감수 필요)
- 부득이하게 꼭 그래야 하는 상황이 있다면, static member class를 사용하는 것을 고려해야한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Song.java
class Song {
static final String NAME = "Dance"
}
class Music {
static final String NAME = "Rap";
}
// Music.java
class Song {
static final String NAME = "Rock"
}
class Music {
static final String NAME = "Hip-hop";
}
1
2
3
4
5
public class Main {
public static void main(String[] args) {
System.out.println(Song.NAME + Music.NAME);
}
}
이 코드를 실행하면 IDE(여기서는 intellij) 자체적으로 에러를 발생한다.
IDE에서 잡아준 에러를 무시하고 강제로 Main class를 실행하면 아래와 같은 결과가 발생한다.
위 처럼 순서를 정해주지 않고 실행하면 에러가 발생하지만, javac 명령어를 통해서 컴파일 순서를 정해주면 동작이 될 수 있다. ex) javac Main.java Song.java
하지만 이는 컴파일러에 어느 파일을 순서에 따라서 동작이 달라질 수 있기 때문에 절대로 이렇게 개발해서는 안된다.
위의 예제를 static member class로 바꾸면 아래와 같다.
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Test {
private static class Song{
static final String NAME = "Dance";
}
private static class Music{
static final String NAME = "Rap";
}
public static void main(String[] args) {
System.out.println(Song.NAME + Music.NAME);
}
}
결론
- 하나의 소스 파일에는 하나의 톱레벨 클래스(혹은 톱레벨 인터페이스)만 두자
- static member class를 사용하자