한 소스 파일에 여러 톱레벨 클래스를 두더라도 자바 컴파일러가 화내지는 않는다.
하지만 이는 별다른 이점도 없을 뿐더러 괜한 위험을 감수하게 되는 행위이다.
class Utensil {
public static void main(String[] args) {
System.out.println(Utensil.NAME + Dessert.NAME);
}
static final String NAME = "pan";
}
class Dessert {
static final String NAME = "cake";
}
Java
복사
Utensil.java
class Utensil {
static final String NAME = "pot";
}
class Dessert {
public static void main(String[] args) {
System.out.println(Utensil.NAME + Dessert.NAME);
}
static final String NAME = "pie";
}
Java
복사
Dessert.java
이런식으로 Utensil.java와 Dessert.java를 만들게 되면 두 클래스 모두 중복이 감지되어 인텔리제이가 화를 낸다.
책에서는 javac Dessert.java를 실행하여 출력을 확인하면, potpie가 출력되고
javac Utensil.java를 실행하여 출력을 확인하면, pancake가 출력된다고 한다.
(하지만 실제로 돌려보려고 하면 기본 클래스를 찾을 수 없다는 에러가 발생한다.)
어쨋든 중요한 포인트는 컴파일러에 어느 소스 파일을 먼저 제공하는지에 따라 동작이 달라질 수 있는 위험이 존재한다는 것이다..!
핵심 정리
교훈은 명확하다.
소스 파일 하나에는 반드시 톱레벨 클래스(혹은 톱레벨 인터페이스)를 하나만 담자.
이 규칙만 따른다면 컴파일러가 한 클래스에 대한 정의를 여러개 만들어 내는 일은 사라진다.
소스 파일을 어떤 순서로 컴파일 하든 바이너리 파일이나 프로그램의 동작이 달라지는 일은 결코 일어나지 않을 것이다.