소스파일 하나에 톱레벨 클래스를 여러개 선언하더라도 자바 컴파일러는 불평하지 않는다.
근데 왜 하나만 담으라고 하지?? 👀
아무런 득이 없는데 SOLID 의 원칙 중 SRP 원칙을 위배하면서 까지 할 이유가 없다. 또한, 심각한 문제가 있다!
* SRP 단일 책임 원칙(Single responsibility principle)
: 하나의 클래스는 하나의 책임만 가져야 한다.
어떤 심각한 문제??
public class Main {
public static void main(String[] args) {
System.out.println (Utensil.NAME + Dessert.NAME ); // pancake
}
}
// Utensil.java 에 정의된 두 클래스
class Utensil {
static final String NAME = "pan";
}
class Dessert {
static final String NAME = "cake";
}
✅ pancake 출력
// Dessert.java 에 정의된 두 클래스
class Utensil {
static final String NAME = "pot";
}
class Dessert {
static final String NAME = "pie";
}
✅ 운좋게 javac Main.java Dessert.java 명령으로 컴파일한다면 컴파일 오류가 나면서 Utensil과 Dessert 클래스를 중복 정의했다고 알려준다.
- 컴파일러는 가장 먼저 Main.java 를 컴파일하고, 그 안에서 Utensil 참조를 만나면 Utensil.java 파일을 살펴 Utensil과 Dessert를 모두 찾아낸다. 그런다음 컴파일러가 두 번째 명령줄 인수로 넘겨온 Dessert.java 를 처리하려 할 때 같은 클래스의 정의가 이미 있음을 알게 된다.
✅ 한편, javac Main.java 나 javac Main.java Utensil.java 명령으로 컴파일하면 Dessert.java 파일을 작성하기 전처럼 pancake 을 출력한다. 하지만 javac Dessert.java Main.java 명령으로 컴파일하면 potpie를 출력한다.
✅ 이처럼 컴파일러에 어느 소스 파일을 먼저 건네느냐에 따라 동작이 달라지는 문제가 있다.
결론❗❗❗ 소스 파일 하나에는 반드시 톱레벨 클래스(인터페이스)를 하나만 담자.
그런데도 소스 파일 하나에 톱레벨 클래스를 여러개 담고 싶다면?? ( 해결책 ✨ )
- 단순 톱레벨 클래스들을 서로 다른 소스 파일로 분리.
- 정적 멤버 클래스를 사용 (private 로 선언)
'Java' 카테고리의 다른 글
Item34. int 상수 대신 열거 타입을 사용하라. (0) | 2022.06.05 |
---|---|
Item31. 한정적 와일드카드를 사용해 API 유연성을 높이라. (0) | 2022.06.04 |
SOLID 좋은 객체지향 설계의 5가지 원칙 (0) | 2022.05.19 |
다형성, 오버라이딩, 오버로딩 (0) | 2022.05.19 |
SNMP GETBULK, SUBTREE 시간 성능 Test (0) | 2020.09.16 |
댓글