파일에 여러 개의 톱 레벨 클래스 정의 시 생기는 문제

  1. 한 클래스를 여러 가지로 정의할 수 있음
  2. 그 중 어느 것을 사용할지는 어느 소스 파일을 먼저 컴파일하느냐에 따라 달라진다.

한 파일에 정의된 여러 개의 톱 레벨 클래스

// Main.java
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 = "cake";
}

다른 파일에 동일한 클래스의 정의

Dessert.java 파일에도 동일하게 클래스를 다음과 같이 정의한다.

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

class Dessert {
    static final String NAME = "pie";
}
javac Main.java Dessert.java // 1) 컴파일 오류
javac Main.java // 2) pancake 출력
javac Main.java Utensil.java // 3) pancake 출력
javac Dessert.java Main.java // 4) potpie 출력

해결 방안

public class Main {
    public static void main(String[] args) {
        System.out.println(Utensil.NAME + Dessert.NAME);
    }
    
    private static class Utensil{
        static final String NAME = "pan";
    }
    
    private static class Dessert{
        static final String NAME = "cake";
    }
}

결론