하나의 소스 파일에 톱레벨 클래스를 여러 개 선언하더라도, 자바 컴파일러는 정상 동작을 한다.

그렇지만 위와 같이 정의하는 것이 왜 위험한지 컴파일 하는 과정을 통해 알아보자.


[문제점]

// Main.java에 정의 된 클래스 (Utensil, Dessert 참조)

public class Main {
    public static void main(String[] args) {
        System.out.println(Utensil.NAME + Dessert.NAME);
    }
}
// A.java에 함께 정의된 클래스

class Utensil {
    static final String NAME = "pan";
}

class Dessert {
    static final String NAME = "cake";
}
// B.java에 함께 정의된 클래스

class Utensil {
    static final String NAME = "pot";
}

class Dessert {
    static final String NAME = "pie";
}

이 때 각 .java 소스 파일을 컴파일 하는 순서에 따라 동작 결과가 달라진다.

  1. javac Main.java Dessert.java