본문 바로가기
Java

Item25. 톱레벨 클래스는 한 파일에 하나만 담으라.

by 쁘니쁘나 2022. 5. 24.

 

소스파일 하나에 톱레벨 클래스를 여러개 선언하더라도 자바 컴파일러는 불평하지 않는다.

 

근데 왜 하나만 담으라고 하지?? 👀

아무런 득이 없는데 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를 출력한다.

✅ 이처럼 컴파일러에 어느 소스 파일을 먼저 건네느냐에 따라 동작이 달라지는 문제가 있다.

 

 

결론❗❗❗ 소스 파일 하나에는 반드시 톱레벨 클래스(인터페이스)를 하나만 담자.

 

그런데도 소스 파일 하나에 톱레벨 클래스를 여러개 담고 싶다면?? ( 해결책 ✨ )

  1. 단순 톱레벨 클래스들을 서로 다른 소스 파일로 분리.
  2. 정적 멤버 클래스를 사용 (private 로 선언)

 

 

댓글