Home Item 25 - 톱레벨 클래스는 한 파일에 하나만 담으라
Post
Cancel

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

A top level class is a class that is not a nested class.

A nested class is any class whose declaration occurs within the body of another class or interface.

출처 : Oracle docs Chapter 8.Classes

톱레벨 클래스란 중첩 클래스가 아닌 클래스이다. 보통 우리가 사용하는 파일 내에 하나만 존재하는 클래스를 톱레벨 클래스라고 한다.
중첩클래스는 다른 클래스 안에 정의된 클래스이다.

왜 톱레벨 클래스는 한 파일에 하나만 담아야 할까?

  • 자바 컴파일러는 소스 파일 하나에 톱레벨 클래스를 여러개 선언하는 것을 막지 않는다.(하지만 심각한 위험 감수 필요)
  • 부득이하게 꼭 그래야 하는 상황이 있다면, static member class를 사용하는 것을 고려해야한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Song.java
class Song {
    static final String NAME = "Dance"
}
class Music {
    static final String NAME = "Rap";
}

// Music.java
class Song {
    static final String NAME = "Rock"
}
class Music {
    static final String NAME = "Hip-hop";
}
1
2
3
4
5
public class Main {
    public static void main(String[] args) {
        System.out.println(Song.NAME + Music.NAME);
    }
}

이 코드를 실행하면 IDE(여기서는 intellij) 자체적으로 에러를 발생한다.

item25_intellij_error

IDE에서 잡아준 에러를 무시하고 강제로 Main class를 실행하면 아래와 같은 결과가 발생한다.

item25_build_result

위 처럼 순서를 정해주지 않고 실행하면 에러가 발생하지만, javac 명령어를 통해서 컴파일 순서를 정해주면 동작이 될 수 있다. ex) javac Main.java Song.java

하지만 이는 컴파일러에 어느 파일을 순서에 따라서 동작이 달라질 수 있기 때문에 절대로 이렇게 개발해서는 안된다.

위의 예제를 static member class로 바꾸면 아래와 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Test {
    private static class Song{
        static final String NAME = "Dance";
    }

    private static class Music{
        static final String NAME = "Rap";
    }

    public static void main(String[] args) {
        System.out.println(Song.NAME + Music.NAME);
    }
}

결론

  • 하나의 소스 파일에는 하나의 톱레벨 클래스(혹은 톱레벨 인터페이스)만 두자
  • static member class를 사용하자
This post is written by PRO.