Item25 - 톱레벨 클래스는 한 파일에 하나만 담으라

2023. 12. 3. 20:11Book/이펙티브 자바

 

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

 

하지만 이점도 없을 뿐더러 위험해질 수 있다. 이렇게 하면 한 클래스를 여러 가지로 정의할 수 있으며, 그중 어느 것을 사용할지는 어느 소스 파일을 먼저 컴파일하냐에 따라 달라지기 때문이다.

public class Main {
    public static void main(String[] args) {
        System.out.println(Utensil.NAME + Dessert.NAME);
    }
}

 

Utensil과 Dessert 클래스가 Utensil.java 라는 한 파일에 정의 되어 있다고 해보자

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

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

 

main을 호출시 pancake가 잘 출력된다. 하지만 Dessert.java 파일을 똑같은 내용으로 만들어보자

// 코드 25-2 두 클래스가 한 파일(Dessert.java)에 정의되었다. - 따라 하지 말 것! (151쪽)
class Utensil {
    static final String NAME = "pot";
}

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

 

컴파일러가 두 소스 파일을 함께 컴파일 하면 duplicate 되었다고 컴파일 에러가 날 것이다.

Utensil 클래스와 main 을 컴파일 한다면 pancake, Dessert와 main을 컴파일 한다면 potpie 를 출력할 것이다. 이처럼 순서에 따라 결과값이 달라질 수 있다.

 

그러니 톱레벨 클래스는 분리하자