소스 파일 하나에 톱레벨 클래스를 여러 개 선언하더라도 자바 컴파일러는 불평하지 않는다.
하지만 심각한 문제를 일으키니 하면 안된다.
Apple의 공식 문서에 따르면 톱-레벨의 정의는 다음과 같다.
Any executable statement not written within a function body,
within a class, or otherwise encapsulated is considered top-level.
함수, 클래스 또는 다른 무언가로 감싸지지 않은 모든 구문은 톱-레벨로 간주된다.
즉, 톱레벨 클래스란 중첩 클래스가 아닌 것을 말한다.
// 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";
}
// Dessert.java
class Utensil {
static final String NAME = "pot";
}
class Dessert {
static final String NAME = "pie";
}
javac Main.java Dessert.java
컴파일 에러가 나도 각 클래스를 중복해서 정의했다고 알려준다.
그 이유는 컴파일러는 다음과 같은 순서로 작동했기 때문이다.
- 먼저
Main.java
컴파일 - 그 안에서
System.out.println(Utensil.NAME + Dessert.NAME);
구문을 만나기 때문에Utensil.java
를 컴파일 - 2번째 인수로 넘어온
Dessert.java
을 컴파일 하려고 할 때 같은 클래스가 이미 정의되어 있는 것을 알게된다.
javac Main.java or javac Main.java Utensil.java
javac Dessert.java Main.java
// Utensil.java
public class Utensil {
static final String NAME = "pan";
}
// Dessert.java
public class Dessert {
static final String NAME = "cake";
}
맴버 클래스는 되도록 static으로 만들어라(아이템 24) By 연로그
public class Main {
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 = "caks";
}
}
- 한 소스 파일안에 톱레벨 클래스를 하나만 만들자.
- 사실 여러 톱레벨 클래스를 만들어도 이점이 없다.
- 터미널을 통해서 javac 명령어를 이용하지 않으면 인텔리제이는 어떤 순서든 컴파일을 해주지 않는다.