[Effective Java] - 4장 아이템 25. 톱레벨 클래스는 한 파일에 하나만 담으라

yeom yaloo·2023년 12월 4일
0

Effective Java

목록 보기
13/20
post-thumbnail

4장 클래스와 인터페이스

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

  • 중첩 클래스의 4가지 종류에 대해서 알아보고 해당 종류의 클래스들이 어떨때 사용되는지 알아보자

[핵심 정리]

  • 하나의 소스 파일에 여러개의 톱레벨 클래스를 선언하지말자
  • 컴파일러는 불평하지 않더라도 심각한 위험을 감수해야할 수도 있다.
  • 어느 소스 파일을 먼저 컴파일하느냐에 따라서 결과는 천차만별로 달라진다.

[한 소스 파일에 여러 톱레벨 클래스를 작성한 경우]

1. 예시 코드

1-1. Main.java

public class Main {
	public static void main(String[] args){
    	System.out.println(Utensil.NAME + Dessert.NAME);
    }
}

1-1 Utensil.java

// Utensil.java

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

class Dessert{
	static final String NAME = "pan";
}

1-2.Dessert.java

// Dessert.java

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

class Dessert{
	static final String NAME = "pan";
}
  • Dessert.java 를 컴파일러가 컴파일 하는 경우라면 운좋게 컴파일 오류가 날 것이다.
    • 중복 정의했기 때문이다.
  • Utensil.java를 먼저 컴파일 하는 경우라면 안에 작성된 두 톱레벨 클래스르 모두 찾아낼 것이다. 그럼 다음 두 번째 명령어 인스루 넘어온 Dessert.java를 처리할 때가 되어서야 같은 클래스의 정의가 이미 있음을 알게 된다.

2. javac 명령어 순서에 따른 다른 결과값

  • javac Main.java Utensil.java: Dessert.java 파일을 작성하기 전처럼 pancake가 출력 된다.
  • javac Dessert.java Main.java: potpie를 출력한다. 해당 경우엔 Dessert.java를 먼저 컴파일 후 Main.java를 컴파일하기 때문에 해당 Dessert.java 컴파일 시점엔 Utensil.java 파일의 존재를 몰라서 중복이 감지되지 않는다. Main에서나 해당 중복 클래스가 감지된다.

[해결 방법?]

1. 톱레벨 클래스를 다른 소스 파일로 분리하면 된다.

2. 정적 멤버 클래스로 만든다

  • 해당 작업은 굳이 클래스를 한곳에서 사용하고 싶다면 사용할 수 있는 방법이다
  • 다른 클래스에 딸린 부차적인 클래스라면 정적 멤버 클래스로 만드는 것이 일반적으로 낫다.
public class Test{
	public static void main(String[] args){
    	
    }


	private static Class Utensil{
    	static final String NAME ="pan";
    }
    
    private static Class Dessert{
    	static final String NAME ="cake";
    }
   
}
profile
즐겁고 괴로운 개발😎

0개의 댓글