소스 파일 하나에 톱레벨 클래스를 여러 개 선언하더라도 자바 컴파일러는 불평하지 않는다.
하지만 아무런 득이 없을 뿐더러 심각한 위험을 감수해야 하는 행위다.
public class Main {
public static void main(String[] args) {
System.out.println(Utensil.NAME + Dessert.NAME);
}
}
// Untensil.java
class Untensil {
static final String NAME = "pan";
}
class Dessert {
static final String NAME = "cake";
}
물론 Main을 실행하면 pankake를 출력한다.
이제 우연히 똑같은 두 클래스를 담은 Dessert.java라는 파일을 만들었다고 해보자
// Dessert.java
class Untensil {
static final String NAME = "pot";
}
class Dessert {
static final String NAME = "pie";
}
운 좋게도 javac Main.java Dessert.java 명령으로 컴파일하다면 오류가 나고 중복 정의에 대해서 알려줄 것이다. 하지만 명령어를 조금 만 실수한다면 의도한 결과와 다른 결과를 얻을 수 있다.
이처럼 컴파일러에 어떤 소스파일을 먼저 건네느냐에 따라 동작이 달라지므로 반드시 잡아야할 문제다
해결책은 간단하다. 톱레벨 클래스들을 서로 다른 소스파일로 분리하면 그만이다.
소스 파일 하나에는 반드시 톱레벨 클래스 하나만을 담자