•소스파일 하나에 톱레벨 클래스를 여러개 선언하더라고 자바컴파일러는 불평하지않지만 아무런 득이없고 심각한 위험감수를 해야함
•한클래스를 여러가지로 정의->어느것을 사용할지는 어느소스파일을먼저 컴파일 하느냐에따라 달라진다
예시
public static void main(String[] args) {
System.out.println(Utensil.NAME+Dessert.NAME);
}
집기(Utensil)와 디저트(Dessert)클래스가 한 파일에 정의되있다고 가정
두클래스가 한파일에 정의->따라하지 말것!
class Utensil {
static final String NAME="pen";
}
class Dessert{
static final String NAME="cake";
}
class Utensil {
static final String NAME="pot";
}
class Dessert{
static final String NAME="pie";
}
javac.Main.java Dessert.java명령으로 컴파일-> 컴파일 오류
(Utensil,Dessert)클래스를 중복정의
컴파일러는 Main.java를 컴파일하고, 그안에서 Utensil참조를 만나면
Utensil 파일을 살펴 두 클래스모두 찾아낸다.
javac.Main.java나 javac Main.java Utensil.java명령으로 컴파일하면 Dessert.java 파일을작성하기 전처럼 pancke를 출력
-->어느 소스 파일을 먼저 건네느냐에따라 동작이 달라진다
해결책은 톱레벨 클래스를 서로 다른 파일로 분리하면 된다
앞의예시를 정적 맴버 클래스로 바꿔본 예
public class Test {
public static void main(String[] args) {
System.out.println(Utensil.NAME+ com.example.java.Dessert.NAME);
}
private static class Utensil{
static final String NAME="pan";
}
private static class Dessert{
static final String NAME="cake";
}
}