아이템 25는 매우 간단하다. 핵심 내용은 아래와 같다.
자바 언어에서는 하나의 소스 파일 안에 여러 개의 클래스를 선언할 수 있지만, 권장되지 않는 방식이다.
이는 코드의 가독성을 떨어뜨릴 뿐만 아니라, 컴파일 동작에도 영향을 줄 수 있다.
따라서 일반적으로는 하나의 소스 파일 안에는 톱 레벨 클래스(top-level class) 하나만을 사용하도록 권장한다.
이렇게 하면 코드가 직관적이고 이해하기 쉽기 때문이다.
인터페이스도 클래스와 마찬가지로 톱 레벨 인터페이스(top-level interface)를 사용하도록 권장한다.
그러나, 때로는 클래스를 중첩 클래스(nested class)로 선언해야 하는 경우가 있다.
cf) 중첩 클래스는 외부 클래스의 멤버로 선언되며, 외부 클래스의 멤버에 접근할 수 있다. 이를 통해 코드의 구조를 체계적으로 유지할 수 있다.
중첩 클래스를 사용할 때는, 정적 멤버 클래스를 사용하는 것이 좋다. 이는 외부 클래스의 인스턴스와 상관없이 독립적으로 사용될 수 있기 때문이다. 또한, 정적 멤버 클래스는 외부 클래스의 비정적 멤버에 접근할 수 없기 떄문에, 코드의 안정성을 높일 수 있다.
위 내용을 설명하는 구체적인 예시를 보자. 코드는 다음과 같다.
// Main.java
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";
}
// Dessert.java
class Utensil {
static final String NAME = "pot";
}
class Dessert {
static final String NAME = "pie";
}
아래 명령어로 컴파일한다면 컴파일 오류가 나고 Utensil과 Dessert 클래스를 중복 정의했다고 알려준다.
javac Main.java Dessert.java
[컴파일 과정]
컴파일러는 Main.java를 컴파일하고 그 안에서 Dessert 참조보다 먼저 나오는 Utensil 참조를 만나 Utensil과 Dessert를 모두 찾아낸다. 이후 두 번째 명령줄 인수인 Dessert.java를 처리할 때 클래스가 중복된다는 점을 알게 된다.
또, 아래 명령어로 컴파일한다면 "pancake"이 출력된다.
javac Main.java
javac Main.java Utensil.java
아래 명령어로 컴파일한다면 "potpie"가 출력된다.
javac Dessert.java Main.java
이런 식으로 컴파일 동작에 영향을 주는 건 당연히 좋지 않다.
이를 해결하기 위해, 애초에 소스 파일 하나에 하나의 톱레벨 클래스를 지정하거나, "굳이" 여러 개 담고 싶다면 private로 범위를 최소화하고 정적 멤버 클래스를 사용하는 방법이 있다.
'Language > Java' 카테고리의 다른 글
| [effective java] 아이템 27. Unchecked Warning을 제거하라. (0) | 2023.05.09 |
|---|---|
| [effective java] 아이템 26. Raw 타입은 사용하지 말라. (0) | 2023.05.09 |
| [effective java] 아이템 17. 변경 가능성을 최소화하라. (0) | 2023.03.25 |
| [effective java] 아이템 16. public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라. (0) | 2023.03.25 |
| [effective java] 아이템 15. 클래스 멤버의 접근 권한을 최소화하라. (0) | 2023.03.25 |