JAVA/Effective Java
item 25. 톱레벨 클래스는 한 파일에 하나만 담아라
Garonguri
2022. 5. 9. 14:42
728x90
톱레벨 클래스란?
/* in Oracle */
A top level class is a class that is not a nested class.
- 중첩되지 않은 클래스
- 즉, 다른 클래스나 인터페이스 내부에 선언되지 않은 클래스를 의미
톱 레벨 클래스를 여러 개 선언한다면, 심각한 위험을 감수해야 한다.
- 한 클래스를 여러 가지로 정의할 수 있기 때문에, 어느 소스파일을 먼저 컴파일하냐에 따라 뭘 사용할지가 달라진다.
ex) Utensil과 Dessert가 모두 Utensil.java에 저장되어 있는 경우
public class item25 {
public static void main(String[] args) {
System.out.println(Utensil.NAME + Dessert.NAME); //pancake
}
}
출력 1. javac Main.java Utensil.java // pancake
출력 2. javac Dessert.java Main.java // potpie
아래와 같이 두 클래스를 한 파일에 정의하는 코드는 컴파일러에 어느 소스 파일을 먼저 전달하느냐에 따라 동작이 달라질 수 있다.
//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";
}
-> 따라서, 톱레벨 클래스를 서로 다른 소스 파일로 분리해야 한다.
//Utensil.java
class Utensil {
static final String NAME="pan";
}
//Dessert.java
class Dessert {
static final String NAME="cake";
}
-> 여러 톱레벨 클래스를 한 파일에 담고 싶으면 정적 멤버 클래스를 사용하자.
- private으로 선언해 접근 범위도 관리하는 것을 잊지 말자.
public class item25 {
public static void main(String[] args) {
System.out.println(Utensil.NAME + Dessert.NAME); //pancake
}
private static class Utensil{
static final String NAME="pan";
}
private static class Dessert{
static final String NAME="cake";
}
}
하나의 소스 파일에는 하나의 톱레벨 클래스만 담자.
단일책임 원칙(Single Responsibility Principle)과 비슷한 느낌이 아닐까 하는 생각이 들었다.
728x90