-
[Effective Java] 아이템25: 톱레벨 클래스는 한 파일에 하나만 담으라Language/Java 2022. 7. 23. 00:06
소스 파일 하나에 여러 개의 톱레벨 클래스를 선언하더라도 자바 컴파일러는 불평하지 않는다.
하지만 아무런 득이 없을 뿐더러 심각한 위험을 감수해야 한다.
한 클래스를 여러 가지로 정의할 수 있으며, 그 중 어느 것을 사용할지는 어느 소스 파일을 먼저 컴파일하느냐에 따라 달라지기 때문이다.💡 예제
Main.java
public class Main { public static void main(String[] args) { System.out.println(Utensil.NAME + Dessert.NAME); } }
Utensil.java
// 두 클래스가 한 파일(Utensil.java)에 정의되었다. - 따라 하지 말 것! class Utensil { static final String NAME = "pan"; } class Dessert { static final String NAME = "cake"; }
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 클래스 중복 정의.
javac Main.java
혹은javac Main.java Utensil.java
로 컴파일하는 경우→ pancake 출력.
javac Dessert.java Main.java
로 컴파일하는 경우→ potpie 출력.
💡 해결책
해결책은 2가지가 있다.
1️⃣ 톱레벨 클래스(Utensil, Dessert)들을 서로 다른 소스 파일로 분리한다.
2️⃣ 정적 멤버 클래스를 사용한다.
// 톱레벨 클래스들을 정적 멤버 클래스로 바꿔본 모습 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"; } }
핵심 정리
소스 파일 하나에는 반드시 톱레벨 클래스 (혹은 톱레벨 인터페이스)를 하나만 담자.
728x90'Language > Java' 카테고리의 다른 글
[Effective Java] 아이템27: 비검사 경고를 제거하라 (0) 2022.07.29 [Effective Java] 아이템26: 로 타입(raw type)은 사용하지 말라 (0) 2022.07.29 [Effective Java] 아이템24: 멤버 클래스는 되도록 static으로 만들라 (0) 2022.07.22 [Effective Java] 아이템23: 태그 달린 클래스보다는 클래스 계층구조를 활용하라 (0) 2022.07.18 [Effective Java] 아이템22: 인터페이스는 타입을 정의하는 용도로만 사용하라 (0) 2022.07.16