코딩은 마라톤

[이펙티브자바] 아이템 25 요약 정리 본문

Language/Java

[이펙티브자바] 아이템 25 요약 정리

anxi 2024. 6. 7. 00:05

오늘은(6월 6일) 나라를 위해 희생한 이들을 기리는 국가추념일입니다. 

목숨을 바친 모든 선열들에 의해 저희가 자유롭게 살 수 있습니다.

항상 감사합니다.

 

 

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

소스파일 하나에 톱레벨 클래스를 여러개 선언하더라도 자바 컴파일러는 문제를 일으키지 않는다.

여러개 선언하는 일은 이득이 없고 심각한 위험이 생길 수 있다.

 

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

Bread.java

class Bread {
	static final String NAME = "소금빵";
}
class Drink {
	static final String NAME = "아메리카노";
}

 

Drink.java

class Bread {
	static final String NAME = "바게트";
}
class Drink {
	static final String NAME = "바닐라라떼";
}

 

  • 만약 Bread.java 클래스만 있었다면 "소금빵 아메리카노" 를 출력한다.
  • Drink.java 클래스가 추가되면?
    • javac Main.java Drink.java 컴파일 
      • 컴파일 오류로 Bread와 Drink 클래스가 중복 정의했음을 알려준다.
      • 컴파일러는 가장 먼저 Main.java를 컴파일하고 Bread 참조에서 Bread와 Drink를 찾아낸다.
      • 이후 Drink.java를 처리할 때 같은 클래스의 정의가 있음을 알게된닫.
    • javac Main.java || javac Main.java Bread.java 컴파일
      • Drink.java 파일 작성 전처럼 "소금빵 아메리카노"를 출력한다.
    • 즉, 컴파일러에 어느 소스 파일은 먼저 건네느냐에 따라 동작이 달라진다.

해결책

  • 톱레벨 클래스들(Bread, Drink)을 서로 다른 소스 파일로 분리하면 된다.
    • Bread.java -> Bread 클래스, Drink.java -> Drink 클래스
  • 만약 여러 톱레벨 클래스를 한 파일에 담고 싶으면 정적 멤버 클래스를 사용할 수도 있다.
public class Main {
    public static void main(String[] args) {
        System.out.println(BREAD.NAME + DRINK.NAME);
    }
    
    private static class Bread {
    	static final String NAME = "소금빵";
    }
    
    private static class Drink {
    	static final String NAME = "아메리카노";
    }
}

 

결론

소스 파일 하나에 반드시 톱레벨 클래스(인터페이스)는 하나만 담자

 

5장 제네릭 직전이라 이번은 아이템 25만 진행하였습니다!