#25 톱 레벨 클래스는 한 파일에 하나만 담으라
하나의 소스 파일에 톱 레벨 클래스를 여러 개 선언해도 컴파일에는 문제가 없습니다.
하지만 어느 소스 파일을 먼저 컴파일하냐에 따라서 예상하지 못한 결과가 발생하기도 합니다.
하나의 소스 파일에 하나의 톱 레벨 클래스만 써야 하는 이유에 대해 살펴보겠습니다.
하나의 Main 클래스에서 다른 톱 레벨 클래스(Coffee and Dessert) 2개를 참조하고 있습니다.
이를 아래와 같이 컴파일할 수 있습니다.
$ javac Main.java
$ java Main
americano and cake
// 1. Main.java 컴파일
// 2. Coffee.java 컴파일 (코드 상 'Dessert.NAME' 보다 'Coffee.NAME' 이 먼저 나오기 때문)
// 3. Coffee.java 내의 Coffee.NAME = "americano"와 Dessert.NAME = "cake" 출력
$ javac Main.java Coffee.java
$ java Main
americano and cake
// 1. Main.java 컴파일
// 2. Coffee.java 컴파일
// 3. Coffee.java 내의 Coffee.NAME = "americano"와 Dessert.NAME = "cake" 출력
만약 컴파일 순서를 바꾼다면, 결과는 달라집니다.
$ javac Dessert.java Main.java
$ java Main
latte and pie
// 1. Dessert.java 컴파일
// 2. Main.java 컴파일
// 3. Dessert.java 내의 Coffee.NAME = "latte"와 Dessert.NAME = "pie" 출력
이 처럼 같은 코드라도, 컴파일 순서에 따라 결과가 달라질 수 있습니다.
해결 방법은 단순하게 톱 레벨 클래스들을 서로 다른 소스 파일로 분리하거나, 정적 멤버 클래스로 구현하면 됩니다.
아무 고민 없이 항상 정적 멤버 클래스로 이용했는데, 컴파일 순서에 따라 저런 결과가 나올 수 도 있네요.