본문 바로가기

JAVA/Effective Java

item 25) 톱레벨 클래스는 한 파일에 하나만 담으라

728x90

 

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

Main 은 Utensil 과 Dessert 클래스를 참조하는데 이 2개가 한파일에 정의되어있다고 가정하자.

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



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

우연히 같은 클래스를 가진 파일이 하나 더있게 되면

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

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

 

운이 좋다면 컴파일 단계에서 컴파일 에러가 나게 된다.

하지만 패키지 위치가 달라 실행이 되더라도 

javac Main.java Utensil.java

javac Dessert.java Main.java 등 컴파일 순서가 달라짐에 따라 실행결과가 전혀 달라진다. (코드 실행결과가 컴파일러에 의존성을 가지게 된다.)

 

해결하는 방법은 클래스를 다른 파일로 분리하거나 다른 클래스와 딸린 부차적인 클래스라면 정적멤버 클래스를 사용하는 것이다.

접근 제어도 관리하고 읽기 쉬워진다는 장점이 생긴다.

다음은 정적멤버 클래스로 위 클래스를 바꿔본 것이다.

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

	private class Dessert{
    	static final String NAME = "pen";
	}
}