이펙티브 자바, 쉽게 정리하기 - item 25. 톱 레벨 클래스는 한 파일에 하나만 담으라
두 클래스가 한 파일에 정의되어 있을 때
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";
}
Main.java
public class Main {
public static void main(String[] args) {
System.out.println(Utensil.NAME + Desert.NAME);
}
}
- 위는
Utensil.java
와Dessert.java
라는 두 개의 파일에 중복으로 정의된 2개의 클래스의 예이다. - 위와 같은 경우
javac
명령어에 들어가는 인수에 따라 실행결과가 달라진다.javac Main.java Dessert.java
: 에러,Utensil
과Dessert
클래스가 중복 정의되었습니다.javac Main.java
,javac Main.java Utensil.java
:"pancake"
출력javac Dessert.java Main.java
:"potpie"
출력- 동작원리
Main.java
가 먼저 인수에 들어왔을 때, 자바는Main.java
를 실행시키며,Utensil.NAME
을 만나고,Utensil.java
파일을 찾아서 클래스를 로드하려한다.- 그래서
javac Main.java
의 경우"pancake"
가 출력된다. - 그래서
javac Main.java Dessert.java
의 경우 클래스가 중복으로 선언되었다고 알린다.
- 그래서
Dessert.java
가 먼저 인수에 들어왔을 때는, 자바는Utensil
클래스와Dessert
클래스의 정의를 불러와 놓는다.- 그래서
javac Dessert.java Main.java
의 경우"potpie"
가 출력된다.
- 그래서
파일을 나누면 위와 같은 복잡한 동작원리도 알 필요 없고, 잠재적 에러도 없으므로 Utensil.java
와 Dessert.java
각 파일별로 클래스는 1개씩만 선언하는 것이 좋다.
굳이 한 파일에 여러 클래스를 정의하고 싶다면?
public class Test {
public static void main(String[] args) {
System.out.println(Utensil.NAME + Dessert.NAME);
}
private static class Utensil {
final String NAME = "pan";
}
private static class Dessert {
final String NAME = "cake";
}
}
핵심 정리
- 소스파일 하나에는 반드시 톱레벨 클래스(혹은 톱레벨 인터페이스)를 하나만 담자.
한 파일 내부에 클래스를 여러 개를 정의하면 아무런 이득 없이 괜히 에러만 발생한다.
반응형
'Java > 이펙티브 자바' 카테고리의 다른 글
이펙티브 자바, 쉽게 정리하기 - item 27. 비검사 경고를 제거하라 (0) | 2022.01.09 |
---|---|
이펙티브 자바, 쉽게 정리하기 - item 26. 로 타입은 사용하지 말라 (0) | 2022.01.09 |
이펙티브 자바, 쉽게 정리하기 - item 24. 멤버 클래스는 되도록 static으로 만들라 (0) | 2022.01.09 |
이펙티브 자바, 쉽게 정리하기 - item 23. 태그 달린 클래스보다는 계층구조를 활용하라 (0) | 2022.01.09 |
이펙티브 자바, 쉽게 정리하기 - item 22. 인터페이스는 타입을 정의하는 용도로만 사용하라 (0) | 2022.01.04 |