Skip to content

Latest commit

 

History

History
82 lines (62 loc) · 2.81 KB

25. 톱레벨 클래스는 한 파일에 하나만 담기.md

File metadata and controls

82 lines (62 loc) · 2.81 KB

[아이템 25] 톱레벨 클래스는 한 파일에 하나만 담기

개요

  • 소스 파일 하나에 클래스를 여러개 선언하더라도 자바 컴파일러는 문제가 없음
  • 장점이 없으며, 심각한 위험 발생 가능
  • 한 클래스를 여러가지로 정의할 수 있으며, 어느 소스 파일을 먼저 컴파일하냐에 따라 실행 결과가 달라짐

Main.java

public class Main {
    public static void main(String[] args) {
        System.out.println("maple: " + MapleStory.INFORMATION + ", lostark :" 
                + LostArk.INFORMATION);
    }
}

LostArk.java

class MapleStory {
    public static String INFORMATION = "bad";
}

class LostArk {
    public static String INFORMATION = "good";
}

MapleStory.java

class MapleStory {
    public static String INFORMATION = "good";
}

class LostArk {
    public static String INFORMATION = "bad";
}
  • javac Main.java LostArk.java
    • MapleStory 클래스를 선언해주지 않은 상황에서 Main.java에서 MapleStory.INFORMATION을 먼저 사용하므로 MapleStory.java를 먼저 살펴본다.
    • 이후 LostArk.java를 인자로 같이 넘겨주는데, Main.java에서 가져온 MapleStory.java의 LostArk, MapleStory 클래스LostArk.java의 LostArk, MapleStory 클래스명이 중복되므로 오류가 난다고 함 → 책에선 에러로 표기되나 실제 테스트 과정에서는 에러가 아닌 LostArk.java를 사용하는걸 확인
  • javac LostArk.java Main.java → “maple : bad, lostark : good” 출력
    • LostArk.java의 MapleStory, LostArk 클래스를 사용하게 된다.
  • javac Main.java LostArk.java MapleStory.java
    • 중복 클래스 선언 오류(duplicate class) → 컴파일이 되지 않음.

결론

  • 컴파일러에 어느 소스코드를 먼저 넘겨주냐에 따라 동작이 달라지므로 해결해야 하는 문제이다.
  • 해결책은 톱레벨 클래스들을 서로 다른 소스 파일로 분리해 준다.
    • (MapleStory.java에는 MapleStory 클래스만, LostArk.java에는 LostArk 클래스만)
  • 굳이 여러 톱레벨 클래스를 한 파일에 담기를 원한다면 정적 멤버 클래스를 고민해보는게 좋다.
public class Main {
    public static void main(String[] args) {
        System.out.println("maple: " + MapleStory.INFORMATION + ", lostark :"
                + LostArk.INFORMATION);
    }

    public static class MapleStory {
        public static String INFORMATION = "good";
    }

    public static class LostArk {
        public static String INFORMATION = "good";
    }
}
  • 사실 IDE에서 대부분 잡아줌.

정리

  • 즉, 소스 파일 하나에는 반드시 톱레벨 클래스(or 인터페이스)를 하나만 담아라.