Skip to content

item 25 sijun

Sijun Noh edited this page Jul 31, 2020 · 1 revision

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

자바는 소스 파일 하나에 여러개의 톱레벨 클래스를 두는 것이 가능하다.

하지만, 컴파일 순서에 따라 결과가 다른 문제가 발생 할 수 있으니 톱레벨 클래스는 하나만 두어야 한다.

// XX.java 내 톱레벨 클래스가 두 개 존재하는 코드 예시
class A {

}

class B {

}

아래 코드는 Utensil 클래스와 Dessert 클래스의 Name 필드를 참고한다.

public class Main {
	public static void main(String[] args){
		System.out.println(Utensil.Name + Dessert.Name);
	}
}
// Utensil.java 소스 파일 내부

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

class Dessert {
    static final String NAME = "cake";
}
// Dessert.java 소스 파일 내부

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

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

Utensil.java와 Dessert.java 파일이 위와 같이 정의되었다고 가정하면 컴파일 순서에 따라 다른 결과를 도출한다.

  1. javac Main.java Dessert.java로 컴파일할 경우

    Main.java 컴파일을 진행할 때 Utensil 참조가 먼저 나옴으로 인해 Utensil 소스코드 내부에서 UtensilDessert 클래스를 찾게된다.

    Dessert.java 컴파일을 진행할 때는 이미 정의된 클래스가 Dessert.java를 컴파일할 때 이미 존재하는 Utensil과 Dessert르 인해서 컴파일 오류가 발생한다

  2. javac Main.javajavac Main.java Utensil.java로 컴파일할 경우

    pencake를 출력

  3. javac Dessert.java Main.java로 컴파일할 경우

    potpie를 출력

이로인해 톱레벨 클래스를 한 파일에 여러개 담으면 안된다. 굳이 담아야 한다면 아이템 24에서 배운 것처럼 정적 멤버 클래스를 사용하라(아래 코드 참조)

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";
    }
}
Clone this wiki locally