본문 바로가기
Effective Java

[Effective Java] 아이템25 톱레밸 클래스는 한 파일에 하나만 담으라

by byeongoo 2021. 3. 2.

■ 하나의 java 파일에는 하나의 톱레밸 class를 생성하자

소스 파일 하나에 여러 톱레밸 클래스를 선언하더라도 자바 컴파일러는 불평하지 않는다. 하지만 이렇게 할 경우 심각한 위험을 감수해야한다.

 

  • 패키지 트리구조로 파악되지 않는 클래스가 생긴다.
  • 수동 컴파일 시 컴파일하는 자바 파일의 순서에 따라 상이한 동작을 초래한다.

예를 들어 다음 코드를 살펴보자

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

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

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

Utensil.java 파일과 Dessert.java 파일 2개가 있다. 그리고 다음 main 메서드를 실행한다고 생각해보자

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

 

위에처럼 톱레밸 클래스 2개를 하나의 파일에 작성하면 원치 않는 결과가 나타날 수 있다.

//실행 결과 : potpie
javac Main.java Dessert.java
//실행 결과 : pancake
javac Main.java Utensil.java

 

■ 정리

  • 소스 파일 하나에는 반드시 톱레밸 클래스(혹은 톱레밸 인터페이스)를 하나만 담자. 이 규칙을 따르면 소스 파일을 어떤 순서로 컴파일하든 동작이 달라지는 일은 일어나지 않는다.