하나의 자바(Java) 프로그램에 두 개 이상의 클래스를 포함하는 것은 충분히 가능하며, 크게 두 가지 방식으로 구현할 수 있습니다.
하나의 자바 프로그램에 여러 클래스를 구현하는 두 가지 방법
- 중첩 클래스(Nested Classes) – 클래스 내부에 클래스를 선언하는 방식
- 비중첩 클래스(Multiple Non-Nested Classes) – 하나의 소스 파일에 여러 개의 독립적인 클래스를 선언하는 방식
비중첩 클래스일 때 컴파일러의 동작 방식
아래 예제에서 자바 프로그램은 두 개의 클래스를 포함하고 있습니다. 하나는 Computer이고, 다른 하나는 Laptop입니다. 두 클래스는 각각 자신만의 생성자와 메서드를 가지고 있으며, main 메서드 안에서 두 클래스의 객체를 생성하고 각각의 메서드를 호출할 수 있습니다.
예제 코드
public class Computer {
Computer() {
System.out.println("Constructor of Computer class.");
}
void computer_method() {
System.out.println("Power gone! Shut down your PC soon...");
}
public static void main(String[] args) {
Computer c = new Computer();
Laptop l = new Laptop();
c.computer_method();
l.laptop_method();
}
}
class Laptop {
Laptop() {
System.out.println("Constructor of Laptop class.");
}
void laptop_method() {
System.out.println("99% Battery available.");
}
}위 프로그램을 컴파일하면 Computer.class와 Laptop.class라는 두 개의 .class 파일이 생성됩니다. 이 방식의 장점은 코드를 다시 컴파일하지 않고도 생성된 .class 파일을 다른 프로젝트에서 재사용할 수 있다는 점입니다. 요약하면, 생성되는 .class 파일의 개수는 소스 코드에 선언된 클래스의 개수와 동일합니다.
클래스는 원하는 만큼 자유롭게 만들 수 있지만, 하나의 파일에 너무 많은 클래스를 작성하면 코드 가독성이 크게 떨어지기 때문에 권장되지 않습니다. 가급적 클래스마다 별도의 파일을 만들어 관리하는 것이 좋은 습관입니다.
실행 결과
Constructor of Computer class. Constructor of Laptop class. Power gone! Shut down your PC soon... 99% Battery available.
중첩 클래스일 때 컴파일러의 동작 방식
여러 개의 내부 클래스(Inner Class)를 포함하는 메인 클래스를 컴파일하면, 컴파일러는 각 내부 클래스마다 별도의 .class 파일을 생성합니다.
예제 코드
// Main class
public class Main {
class Test1 { // Inner class Test1
}
class Test2 { // Inner class Test2
}
public static void main(String [] args) {
new Object() { // Anonymous inner class 1
};
new Object() { // Anonymous inner class 2
};
System.out.println("Welcome to Tutorials Point");
}
}위 프로그램의 Main 클래스는 Test1, Test2, 익명 내부 클래스 1(Anonymous inner class 1), 익명 내부 클래스 2(Anonymous inner class 2)라는 네 개의 내부 클래스를 가지고 있습니다. 이 클래스를 컴파일하면 다음과 같은 클래스 파일들이 생성됩니다.
- Main.class
- Main$Test1.class
- Main$Test2.class
- Main$1.class
- Main$2.class
실행 결과
Welcome to Tutorials Point
정리
자바에서는 하나의 소스 파일에 여러 클래스를 선언할 수 있으며, 컴파일러는 각 클래스마다 개별적인 .class 파일을 생성합니다. 다만 코드의 가독성과 유지보수성을 고려하면, 하나의 파일에는 하나의 public 클래스만 두고 나머지 클래스는 별도 파일로 분리하거나 중첩 클래스를 활용하는 것이 바람직합니다.