[아이템 25] 톱레벨 클래스는 한 파일에 하나만 담으라

gang_shik·2022년 4월 30일
0

Effective Java 4장

목록 보기
11/11
  • 소스 파일 하나에 톱레벨 클래스를 여러 개 선언하면 위험할 수 있음, 한 클래스를 여러 가지로 정의할 수 있으며 그 중 어느것을 사용할지는 어느 소스 파일을 먼저 컴파일하냐에 따라 달라지기 때문에

예시

public class Main {
	 public static void main(String[] args) {
			 System.out.println(Utensil.NAME + Dessert.NAME);
	 }
}
  • 그리고 UtensilDessert 가 한 파일에 아래와 같이 각각 정의됐다면?
// Utensil
class Utensil {
		static final String NAME = "pan";
}

class Dessert {
		static final String NAME = "cake";
}
// Dessert
class Utensil {
		static final String NAME = "pot";
}

class Dessert {
		static final String NAME = "pie";
}
  • 만약 여기서 javac Main.java Dessert.java 로 컴파일 하면 컴파일 오류가 나서 클래스를 중복 정의했다고 나올 것임

  • 하지만 javac Main.java 혹은 javac Main.java Utensil.java 로 컴파일시 오류가 나지않고 작동함, 즉 소스 파일을 먼저 건네느냐에 따라 동작이 달라짐

해결책

  • 가장 간단한 방법은 톱레벨 클래스들을 서로 다른 소스 파일로 분리하면 그만임

  • 굳이 담고 싶다면 정적 멤버 클래스를 사용하는 방법을 고민해볼 수 있음

  • 다른 클래스에 딸린 부차적인 클래스라면 정적 멤버 클래스로 만드는 쪽이 일반적으로 더 나을 것이고 읽기 좋고 private 선언하면 접근 범위도 최소로 관리할 수 있음

// 정적 멤버 클래스 적용
public class Test {
	 public static void main(String[] args) {
			 System.out.println(Utensil.NAME + Dessert.NAME);
	 }

	 private static class Utensil {
			 static final String NAME = "pan";
	 }

	 private static class Dessert {
			 static final String NAME = "cake";
	 }
}
profile
측정할 수 없으면 관리할 수 없고, 관리할 수 없으면 개선시킬 수도 없다

0개의 댓글