-
Item 25. 톱레벨 클래스는 한 파일에 하나만 담으라Book/Effective Java 3E 2022. 11. 6. 09:42반응형
소스 파일 하나에 톱레벨 클래스를 여러 개 선언하면 어느 소스 파일을 먼저 컴파일하느냐에 따라 결과가 달라집니다. 다음 소스 파일은 Main 클래스 하나를 담고 있고, Main 클래스는 다른 톱레벨 클래스 2개(Utensil과 Dessert)를 참조합니다.
package effectivejava.chapter4.item25; public class Main { public static void main(String[] args) { System.out.println(Utensil.NAME + Dessert.NAME); } }
Utensil와 Dessert 클래스가 Utensil.java라는 파일과 Dessert.java라는 파일에 동시 정의되어 있다고 가정해 봅시다.
package effectivejava.chapter4.item25; // 코드 25-1 두 클래스가 한 파일(Utensil.java)에 정의되었다. - 따라 하지 말 것! class Utensil { static final String NAME = "pan"; } class Dessert { static final String NAME = "cake"; }
package effectivejava.chapter4.item25; // 코드 25-2 두 클래스가 한 파일(Dessert.java)에 정의되었다. - 따라 하지 말 것! //class Utensil { // static final String NAME = "pot"; //} // //class Dessert { // static final String NAME = "pie"; //}
다음 명령어로 컴파일 시 결과는 상이합니다.
- javac Main.java Dessert.java: 컴파일 오류(Utensil과 Dessert 클래스 중복 정의)
- javac Main.java: 정상 동작(pancake 출력)
- javac Main.java Utensil.java: 정상 동작(pancake 출력)
- javac Dessert.java Main.java: 정상 동작(potpie 출력)
이처럼 컴파일러에 어느 소스 파일을 먼저 건네느냐에 따라 동작이 달라지므로 톱레벨 클래스들(Utensil과 Dessert)을 서로 다른 소스 파일로 분리하는 게 좋습니다. 굳이 여러 톱레벨 클래스를 한 파일에 담고 싶다면 정적 멤버 클래스를 사용하는 방법을 고민해볼 수 있습니다. 다음 코드는 앞의 예를 정적 멤버 클래스로 바꿔본 예입니다.
package effectivejava.chapter4.item25; // 코드 25-3 톱레벨 클래스들을 정적 멤버 클래스로 바꿔본 모습 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"; } }
[참고 정보]
이펙티브 자바 Effective Java 3/E 도서 [조슈아 블로크 저]
반응형'Book > Effective Java 3E' 카테고리의 다른 글
Item 27. 비검사 경고를 제거하라 (0) 2022.11.08 Item 26. 로 타입은 사용하지 말라 (0) 2022.11.08 Item 24. 멤버 클래스는 되도록 static으로 만들라 (2) 2022.11.06 Item 23. 태그 달린 클래스보다는 클래스 계층구조를 활용하라 (0) 2022.11.02 Item 22. 인터페이스는 타입을 정의하는 용도로만 사용하라 (0) 2022.11.02