[Effective Java/아이템25] 톱레벨 클래스는 한 파일에 하나만 담아라.
2022. 3. 3. 22:30
반응형
# 아이템25. 톱레벨 클래스는 한 파일에 하나만 담아라.
## 한 파일에 톱레벨 클래스가 여러 개일 때 문제점
public class Main {
public static void main(String[] args) {
System.out.println(Utensil.NAME + Dessert.NAME);
}
}
// Utensil.java
class Utensil {
static final String NAME = "pan";
}
class Dessert {
static final String NAME = "cake";
}
javac Main.java Utensil.java
> pancake
Main 클래스를 실행하면 pancake가 출력된다.
이 상태에서 똑같은 두 클래스를 담은 Dessert.java가 추가되면
class Utensil {
static final String NAME = "pot";
}
class Dessert {
static final String NAME = "pie";
}
javac Main.java Dessert.java
> Duplicate class found in the file '~/src/main/java/Dessert.java'
javac Main.java Dessert.java 명령어로 컴파일을 한다면 컴파일 오류가 발생하고 클래스가 중복 정의되었다고 알려준다.
컴파일은 가장먼저 Main.java를 컴파일하고, 그 안에서 Utensil 참조를 먼저 만나 Utensil.java 파일을 살펴서 Utensil, Dessert 클래스를 모두 찾아낸다. 그 다음 두번째로 참조되는 Dessert에 따라 Dessert.java를 처리하려고 할 때 같은 클래스의 정의가 이미 되어있음을 알게 된다.
javac Main.java
> pancake
javac Main.java Utensil.java
> pancake
javac Dessert.java Main.java
> potpie
이처럼 컴파일러에 어느 소스파일을 먼저 전달하느냐에 따라 동작이 달라진다.
## 해결책
톱클래스를 서로 다른 소스 파일로 분리하면 된다.
// Utensil.java
class Utensil {
static final String NAME = "pan";
}
// Dessert.java
class Dessert {
static final String NAME = "cake";
}
## 정적 멤버 클래스
굳이 한 파일에 담고싶다면 정적 멤버 클래스를 사용하는 방법을 고려하자. 부차적인 클래스를 정적 멤버 클래스로 만들면 가독성도 높아지고, private로 선언하여 접근 범위도 최소로 관리할 수 있다.
단, 정적 멤버 클래스는 보통 하나의 클래스에 딸린 부차적인 클래스를 추가하는데 사용되므로, 패턴을 유지하기 위해 부차적인 클래스를 추가하는 경우에만 사용하자.
// example
class Utensil {
static final String NAME = "pan";
private static class Dessert {
static final String Name = "cake";
}
}
class Test {
public static void main(String[] args) {
System.out.println(Utensil.NAME + Dessert.NAME);
}
private static class Utensil {
static final String NAME = "fan";
}
private static class Dessert {
static final String NAME = "cake";
}
}
## 정리
소스 파일 하나에는 반드시 톱레벨 클래스(혹은 인터페이스)를 하나만 담자. 이 규칙만 따른다면 소스파일을 어떤 순서로 컴파일 하든 프로그램의 동작이 달라지지 않는다.
728x90
반응형
'dev book > Effective Java' 카테고리의 다른 글
[Effective Java/아이템27] 비검사 경고를 제거하라. (0) | 2022.03.19 |
---|---|
[Effective Java/아이템26] 로타입은 사용하지 마라. (0) | 2022.03.04 |
[Effective Java/아이템24] 멤버 클래스는 되도록 static으로 만들라. (0) | 2022.03.02 |
[Effective Java/아이템23] 태그 달린 클래스보다는 클래스 계층 구조를 활용하라. (0) | 2021.12.10 |
[Effective Java/아이템22] 인터페이스는 타입을 정의하는 용도로만 사용하라. (0) | 2021.12.09 |
Written by ner.o
개발자 네로의 개발 일기,
자바를 좋아합니다 !
댓글 개