[핵심 정리]
- 하나의 소스 파일에 여러개의 톱레벨 클래스를 선언하지말자
- 컴파일러는 불평하지 않더라도 심각한 위험을 감수해야할 수도 있다.
- 어느 소스 파일을 먼저 컴파일하느냐에 따라서 결과는 천차만별로 달라진다.
public class Main {
public static void main(String[] args){
System.out.println(Utensil.NAME + Dessert.NAME);
}
}
// Utensil.java
class Utensil{
static final String NAME = "pan";
}
class Dessert{
static final String NAME = "pan";
}
// Dessert.java
class Utensil{
static final String NAME = "pan";
}
class Dessert{
static final String NAME = "pan";
}
javac Main.java Utensil.java
: Dessert.java 파일을 작성하기 전처럼 pancake가 출력 된다.javac Dessert.java Main.java
: potpie를 출력한다. 해당 경우엔 Dessert.java를 먼저 컴파일 후 Main.java를 컴파일하기 때문에 해당 Dessert.java 컴파일 시점엔 Utensil.java 파일의 존재를 몰라서 중복이 감지되지 않는다. Main에서나 해당 중복 클래스가 감지된다.
public class Test{
public static void main(String[] args){
}
private static Class Utensil{
static final String NAME ="pan";
}
private static Class Dessert{
static final String NAME ="cake";
}
}