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

김동훈·2023년 6월 28일
1

Effective-java

목록 보기
9/14

톱 레벨 클래스란 내부 클래스와 반대로 생각하면 된다. 가장 바깥의 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가지의 컴파일 순서를 가지고 실행해보았다.

javac Main.java Dessert.java | javac Dessert.java Main.java

컴파일되고, main.class를 보면 potpie로 출력될 것 이라 컴파일 된다.

public class Main {
    public Main() {
    }

    public static void main(String[] var0) {
        System.out.println("potpie");
    }
}

javac Main.java Utensil.java | javac Utensil.java Main.java

마찬가지로 compile은 되고 이번엔 PANCAKE으로 출력된다.

public class Main {
    public Main() {
    }

    public static void main(String[] var0) {
        System.out.println("PANCAKE");
    }
}

javac Main.java

책에서는 javac Main.java Utensil.java와 동일하게 동작된다고 하지만 실제로 내 환경에서는 컴파일 오류가 발생했다. Symbol을 찾지 못한다고 한다.

Symbol오류는 내가 알기로는 Main클래스에 해당 symbol이 없어서 발생하는 거로 안다. 그래서 Main클래스에 Utensil, Dessert클래스를 작성하면 다시 컴파일 되는 것을 볼 수 있긴한데, 이렇게 작성하면 이 책에서 말하는 의도가 아니게 된다 생각한다. 이 부분에 관해서는 내가 java에 대해 더 공부하다 보면 이해할 수 있는 부분이라 생각하고 기억해둔 채로 넘어간다.

javac Utensil.java Dessert.java | javac Dessert.java Utensil.java

이번에는 Symbol오류가 아닌 duplicate class 오류가 발생했다.


effective-java스터디에서 공유하고 있는 전체 item에 대한 정리글

profile
董訓은 영어로 mentor

0개의 댓글