톱 레벨 클래스란 내부 클래스
와 반대로 생각하면 된다. 가장 바깥의 class를 의미한다.
Main.java
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";
}
여기서 Utensil, Dessert클래스가 바로 톱레벨 클래스라고 볼 수 있다.
이 구조로 main을 실행시키면 PANCAKE
가 출력된다.
지금은 아무 문제가 생기지는 않는다.
하지만 만약 Dessert.java라는 파일이 생성되고, 우연히도 class명이 겹친 class를 만들게되면 문제가된다.
Dessert.java
class Utensil {
static final String NAME = "PAN";
}
class Dessert{
static final String NAME = "CAKE";
}
책에서는 javac Main.java Dessert.java
명령어로 컴파일을 하면 Utensil과 Dessert클래스가 중복되었다
고 알려준다고 한다.
하지만, 내가 해볼때는 계속 컴파일이 될 뿐이었다. 진짜 이거 때문에 몇일동안 계속 뭐가 잘못된건지 생각해봤는데, 내 결론은 컴파일러
밖에 떠오르지 않았다.(아닐수도 있다. 내 추측이다.) 혹시 다른 분들도 책의 내용을 따라하다가 나처럼 다르게 동작할 수 있을 것 같아 언급해보았다.
이펙티브 자바의 저자의 jdk는
Zulu의 OpenJDK 9.0.0.15
라고 한다. 옮긴이 이신이복연
저자분의 환경은 어떻게 구성하신 지는 확인해보지 못했고, 현재 내 jdk는 Oracle의 jdk11.0.14을 사용하고 있다.
Zulu의 jdk버전
이 한참 옜날 버전인 점도 있겠고, 어쨋든 서로 다른 jdk이기 때문에 차이가 발생하는 부분은 있을 것 이라 생각하기로 했다..
Zulu jdk 9.0.0.15로 설정하고 해보려고 했지만, aZule의 릴리즈 노트를 보면 9.0.0.15버전을 찾을 수 없어 포기했다.
그럼 내 환경에서 실행한 결과에 대해 써보도록 하겠다.
Intellij IDE에서는 Duplicated Class
라며 에러를 보여주고 있다.
우선 총 4가지의 컴파일 순서를 가지고 실행해보았다.
컴파일되고, main.class를 보면 potpie
로 출력될 것 이라 컴파일 된다.
public class Main {
public Main() {
}
public static void main(String[] var0) {
System.out.println("potpie");
}
}
마찬가지로 compile은 되고 이번엔 PANCAKE
으로 출력된다.
public class Main {
public Main() {
}
public static void main(String[] var0) {
System.out.println("PANCAKE");
}
}
책에서는 javac Main.java Utensil.java
와 동일하게 동작된다고 하지만 실제로 내 환경에서는 컴파일 오류가 발생했다. Symbol을 찾지 못한다고 한다.
Symbol오류는 내가 알기로는 Main클래스에 해당 symbol이 없어서 발생하는 거로 안다. 그래서 Main클래스에 Utensil, Dessert클래스를 작성하면 다시 컴파일 되는 것을 볼 수 있긴한데, 이렇게 작성하면 이 책에서 말하는 의도가 아니게 된다 생각한다. 이 부분에 관해서는 내가 java에 대해 더 공부하다 보면 이해할 수 있는 부분이라 생각하고 기억해둔 채로 넘어간다.
이번에는 Symbol오류가 아닌 duplicate class 오류가 발생했다.
effective-java스터디에서 공유하고 있는 전체 item에 대한 정리글