보통 클래스는 하나의 책임을 가지고 정의한다. 한 파일에 하나의 클래스가 있다면 클래스를 파악하기 쉽고 이해하기 쉽다.
실수로 클래스를 중복 정의하게 되면, 컴파일 순서에 따라 에러가 발생하거나 다른 동작을 수행하게 된다.
예를 들어보자
// Main.java
public class Main {
public satic void main(String[] args) {
System.out.println(Utensil.NAME + Desert.NAME);
}
}
// Utensil.java
class Utensil {
static final String NAME = "pan";
}
class Desert {
static final String NAME = "cake";
}
// Desert.java
class Utensil {
static final String NAME = "pot";
}
class Desert {
static final String NAME = "pie";
}
만약 javac Main.java Desert.java
로 컴파일을 했다면 Main.java에서 Utensil.NAME을 보고 먼저 처리하고 Desert.NAME을 처리하므로 Utensil.java 내용을 가져와 컴파일을 수행한다. 그 이후 Desert.java 컴파일을 수행하는데 해당 클래스는 이미 컴파일 되어 있으므로 컴파일 에러가 발생한다.
그러나 javac Main.java
나 javac Main.java Utensil.java
의 경우 Main을 컴파일할 때 Utensil.NAME에 대한 내용이 없으므로 Utensil.java에서 컴파일에서 가져오고 Utensil.java는 같은 파일이니 별다른 문제 없이 "pancake"를 출력한다. javac Desert.java Main.java
로 컴파일한 경우 Desert.java에서 Utensil과 Desert 관련 정보를 가져오므로 추가 컴파일을 진행하지 않고 Main.java를 컴파일하기 때문에 "potpie"를 리턴한다.
컴파일 순서에 따라 모두 리턴이 달라지는 문제가 생기기 때문에 이를 방지하기 위해 톱 클래스에는 하나의 클래스를 둔다.