Java 정적 중첩 클래스 이해: 용법, 내부 클래스와의 차이, 예제
Java 정적 중첩 클래스
Java 정적 중첩 클래스 동작 원리, 내부 클래스와의 차이점, 실전 코드 예제로 활용법을 알아봅니다.
Java에서 클래스 안에 다른 클래스를 정의할 수 있습니다. 이를 중첩 클래스라 하며 두 형태가 있습니다:
- Non-static 중첩 클래스 (내부 클래스)
- Static 중첩 클래스
내부 클래스는 이전 튜토리얼에서 다뤘으므로 이 글은 정적 중첩 클래스에 집중합니다.
Java 정적 중첩 클래스
중첩 클래스를 static으로 선언하려면 static 키워드를 앞에 붙입니다:
class Animal { static class Mammal { // Mammal의 static 및 non-static 멤버 } // Animal의 멤버 }
참고: 중첩 클래스만 static 선언 가능; 최상위 클래스는 불가.
일반 클래스처럼 정적 중첩 클래스도 정적 및 인스턴스 멤버를 모두 가질 수 있습니다.
외부 클래스의 정적 멤버이므로 외부 클래스 인스턴스 생성 없이 정적 중첩 클래스에 접근 가능합니다.
예제: 정적 중첩 클래스
class Animal { // 내부 클래스 class Reptile { public void displayInfo() { System.out.println("I am a reptile."); } } // 정적 중첩 클래스 static class Mammal { public void displayInfo() { System.out.println("I am a mammal."); } } } class Main { public static void main(String[] args) { // 외부 클래스 인스턴스 생성 Animal animal = new Animal(); // non-static 내부 클래스 인스턴스 생성 Animal.Reptile reptile = animal.new Reptile(); reptile.displayInfo(); // 정적 중첩 클래스 인스턴스 생성 Animal.Mammal mammal = new Animal.Mammal(); mammal.displayInfo(); } }
출력
I am a reptile. I am a mammal.
위 코드에서 Mammal은 정적 중첩 클래스, Reptile은 내부 클래스입니다.
다른 인스턴스화 문법에 주목하세요:
- Non-static 내부 클래스:
Animal.Reptile reptile = animal.new Reptile();
- Static 중첩 클래스:
Animal.Mammal mammal = new Animal.Mammal();
외부 클래스 멤버 접근
정적 중첩 클래스는 외부 클래스와 연관되어 있지만 정적 멤버만 접근 가능합니다. 인스턴스 멤버 참조 시 컴파일 에러 발생.
예제: Non-static 메서드 호출 시도
class Animal { static class Mammal { public void displayInfo() { System.out.println("I am a mammal."); } } class Reptile { public void displayInfo() { System.out.println("I am a reptile."); } } public void eat() { System.out.println("I eat food."); } } class Main { public static void main(String[] args) { Animal animal = new Animal(); Animal.Reptile reptile = animal.new Reptile(); reptile.displayInfo(); Animal.Mammal mammal = new Animal.Mammal(); mammal.displayInfo(); mammal.eat(); // ❌ 컴파일 에러 } }
출력
Main.java:28: error: cannot find symbol mammal.eat(); ^ symbol: method eat() location: variable mammal of type Mammal 1 error compiler exit status 1
mammal이 정적 중첩 클래스 인스턴스라 Animal의 non-static eat() 메서드 호출 불가하여 에러 발생.
Static 최상위 클래스?
Java는 static 최상위 클래스를 금지합니다. 중첩 클래스만 static 선언 가능. 다음 코드는 컴파일러 에러를 보여줍니다:
static class Animal { public static void displayInfo() { System.out.println("I am an animal"); } } class Main { public static void main(String[] args) { Animal.displayInfo(); } }
출력
Main.java:1: error: modifier static not allowed here static class Animal { ^ 1 error compiler exit status 1
중첩 클래스만 static이 될 수 있음을 확인합니다.