본문 바로가기
JAVA/Effective Java

item 25. 톱레벨 클래스는 한 파일에 하나만 담아라

by Garonguri 2022. 5. 9.
728x90

톱레벨 클래스란?

 /* in Oracle */
 
 A top level class is a class that is not a nested class.

- 중첩되지 않은 클래스

- 즉, 다른 클래스나 인터페이스 내부에 선언되지 않은 클래스를 의미

 

톱 레벨 클래스를 여러 개 선언한다면, 심각한 위험을 감수해야 한다.

- 한 클래스를 여러 가지로 정의할 수 있기 때문에, 어느 소스파일을 먼저 컴파일하냐에 따라 뭘 사용할지가 달라진다.

 

ex) Utensil과 Dessert가 모두 Utensil.java에 저장되어 있는 경우

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

출력 1. javac Main.java Utensil.java // pancake
출력 2. javac Dessert.java Main.java // potpie

아래와 같이 두 클래스를 한 파일에 정의하는 코드는 컴파일러에 어느 소스 파일을 먼저 전달하느냐에 따라 동작이 달라질 수 있다.

//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";
}

 

-> 따라서, 톱레벨 클래스를 서로 다른 소스 파일로 분리해야 한다.

//Utensil.java
class Utensil {
    static final String NAME="pan";
}
//Dessert.java
class Dessert {
    static final String NAME="cake";
}

 

-> 여러 톱레벨 클래스를 한 파일에 담고 싶으면 정적 멤버 클래스를 사용하자.

- private으로 선언해 접근 범위도 관리하는 것을 잊지 말자.

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

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

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

 

하나의 소스 파일에는 하나의 톱레벨 클래스만 담자.

단일책임 원칙(Single Responsibility Principle)과 비슷한 느낌이 아닐까 하는 생각이 들었다.

 

728x90

댓글