-
Notifications
You must be signed in to change notification settings - Fork 1
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 파일이 위와 같이 정의되었다고 가정하면 컴파일 순서에 따라 다른 결과를 도출한다.
-
javac Main.java Dessert.java
로 컴파일할 경우Main.java
컴파일을 진행할 때Utensil
참조가 먼저 나옴으로 인해Utensil
소스코드 내부에서Utensil
과Dessert
클래스를 찾게된다.Dessert.java
컴파일을 진행할 때는 이미 정의된 클래스가 Dessert.java를 컴파일할 때 이미 존재하는 Utensil과 Dessert르 인해서 컴파일 오류가 발생한다 -
javac Main.java
나javac Main.java Utensil.java
로 컴파일할 경우pencake를 출력
-
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";
}
}