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

2024. 10. 17. 20:37·1️⃣ 백앤드/이펙티브 자바

1. 톱 레벨 클래스는 파일 당 하나

최상단에 위치한 클래스는 한 파일에 하나만 있어야 한다. 비록 여러개를 선언하더라도 컴파일은 되지만, 심각한 위험을 감수해야 한다. 동일하게 선언된 클래스 여러 파일 중 어느 것을 먼저 컴파일을 하냐에 따라 결과가 달라지기 때문이다. 아래 예시를 살펴보자. 

한 파일 당 하나

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 라는 파일이 생성된다고 해보자.

// Dessert.java

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

class Dessert {
    static final String NAME = "pie";
}
만약, 운 좋게 javac Main.java Dessert.java 명령으로 컴파일 되었다면?

컴파일 오류가 나며 Utensil 과 Dessert 클래스가 중복되었다고 알려줄 것이다. 이유는, Main 이 실행되면서 Utensil 참조를 만나면, Utensil.java 파일을 뒤져 Utensil 과 Dessert 클래스를 모두 찾아낼 것이다. 그 다음, Dessert 참조를 만나게 되었을 때 컴파일 오류를 뱉는 것이다.

만약, 운 나쁘게 javac Main.java Utensil.java 명령으로 컴파일 되었다면?

컴파일 단계에서 오류를 뱉지 못하고 potpie 를 출력한다. 이처럼, 컴파일러에 어느 소스 파일을 먼저 건네느냐에 따라 동작이 달라진다.

 

2. 해결책

톱레벨 클래스들을 서로 다른 소스 파일로 분리하자. 특히, 정적 멤버 클래스를 사용할 수 있다. 다른 클래스에 딸린 부차적 클래스라면, 정적 멤버 클래스로 만드는 편이 읽기 좋고, private 으로 선언하면 접근 범위도 최소화할 수 있다.

public class Test {
    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";
    }
}

'1️⃣ 백앤드 > 이펙티브 자바' 카테고리의 다른 글

[아이템27] 비검사 경고를 제거하라  (0) 2024.10.22
[아이템26] 로 타입은 사용하지 말라  (0) 2024.10.18
[아이템24] 멤버 클래스를 되도록 static 으로 만들어라  (2) 2024.10.17
[아이템23] 태그 달린 클래스보다는 클래스 계층구조를 활용하라  (0) 2024.10.16
[아이템22] 인터페이스는 타입을 정의하는 용도로만 사용하라  (0) 2024.10.15
'1️⃣ 백앤드/이펙티브 자바' 카테고리의 다른 글
  • [아이템27] 비검사 경고를 제거하라
  • [아이템26] 로 타입은 사용하지 말라
  • [아이템24] 멤버 클래스를 되도록 static 으로 만들어라
  • [아이템23] 태그 달린 클래스보다는 클래스 계층구조를 활용하라
HOZINU
HOZINU
주니어 백앤드 개발자의 세상만사 이모저모. 주로 개발 이야기를 다룸.
  • HOZINU
    백엔드 탐험 일지
    HOZINU
  • 전체
    오늘
    어제
  • 블로그 메뉴

    • ⛪ HOME
    • 🌍 GITHUB
    • 카테고리 (73)
      • 1️⃣ 백앤드 (72)
        • 이펙티브 자바 (72)
      • 2️⃣ CS (0)
        • 운영체제 (0)
        • 네트워크 기초 (0)
        • 네트워크 응용 (0)
        • SSL & PKI (0)
        • 기타 (0)
      • 3️⃣ 코딩테스트 (0)
      • 4️⃣ 개인공부 (0)
        • MSA (0)
        • REDIS (0)
      • 5️⃣ 일상이야기 (1)
  • 인기 글

  • 태그

    로타입
    Comparable
    맥북
    표준예외
    의존객체
    정보은닉
    빌더
    컴포지션
    정적 팩터리 메서드
    optional
    finalizer
    멤버클래스
    CLONE
    try-with-resources
    Cleaner
    계층구조
    hashcode
    equals
    싱글턴
    캡슐화
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
HOZINU
[아이템25] 톱레벨 클래스는 한 파일에 하나만 담으라
상단으로

티스토리툴바