개발/자바

중첩 클래스 (Nested Class) - Inner Class vs Static Nested Class

피터JK 2025. 2. 18. 11:24
728x90

🔹 중첩 클래스 (Nested Class)

**중첩 클래스(Nested Class)**는 클래스 내부에 선언된 클래스를 의미합니다.
Java에서 중첩 클래스는 크게 **내부 클래스(Inner Class)**와 **정적 중첩 클래스(Static Nested Class)**로 나뉩니다.


1️⃣ 내부 클래스 (Inner Class)

**내부 클래스(Inner Class)**는 외부 클래스의 인스턴스에 종속되는 클래스입니다.
즉, 외부 클래스의 멤버(변수, 메소드 등)에 자유롭게 접근할 수 있습니다.

✅ 사용 예시

class Outer {
    private String message = "Hello from Outer!";

    class Inner {
        void display() {
            System.out.println(message); // 외부 클래스의 private 변수에도 접근 가능
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Outer outer = new Outer();          // 외부 클래스 객체 생성
        Outer.Inner inner = outer.new Inner();  // 내부 클래스 객체 생성
        inner.display();  // 출력: Hello from Outer!
    }
}

✅ 특징

  • 외부 클래스의 인스턴스가 있어야 내부 클래스를 사용할 수 있음.
  • 외부 클래스의 private 멤버에도 접근 가능.
  • 내부 클래스는 외부 클래스의 인스턴스를 암묵적으로 참조 (Outer.this 사용 가능).

2️⃣ 정적 중첩 클래스 (Static Nested Class)

**정적 중첩 클래스(Static Nested Class)**는 외부 클래스의 인스턴스와 독립적으로 존재할 수 있는 클래스입니다.
즉, static 키워드가 붙어 있으며, 외부 클래스의 인스턴스 없이 사용할 수 있습니다.

✅ 사용 예시

class Outer {
    private static String message = "Hello from Static Nested Class!";

    static class StaticNested {
        void display() {
            System.out.println(message); // 정적 멤버만 접근 가능
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Outer.StaticNested nested = new Outer.StaticNested();  // 외부 클래스 인스턴스 없이 생성 가능
        nested.display();  // 출력: Hello from Static Nested Class!
    }
}

✅ 특징

  • 외부 클래스의 인스턴스 없이도 생성 가능 (new Outer.StaticNested() 형태).
  • 외부 클래스의 static 멤버에는 접근 가능하지만, 인스턴스 멤버에는 접근 불가능.
  • 독립적으로 존재할 수 있어 메모리 사용량을 줄이고, 성능을 최적화할 수 있음.

3️⃣ 내부 클래스 vs 정적 중첩 클래스 비교

구분 내부 클래스 (Inner Class) 정적 중첩 클래스 (Static Nested Class)
인스턴스 종속 여부 외부 클래스의 인스턴스 필요 외부 클래스의 인스턴스 없이 생성 가능
외부 클래스 멤버 접근 모든 멤버(인스턴스 & static) 접근 가능 static 멤버만 접근 가능
메모리 사용 외부 클래스의 인스턴스와 함께 유지됨 독립적으로 존재 가능, 메모리 절약
사용 목적 외부 클래스의 인스턴스와 강하게 연결된 경우 외부 클래스와 논리적으로 관련 있지만 독립적인 경우

🔥 언제 사용하면 좋을까?

  1. 내부 클래스 사용
    • 외부 클래스의 인스턴스와 강한 관계가 있는 경우
    • 외부 클래스의 private 멤버를 직접 사용해야 할 때
  2. 정적 중첩 클래스 사용
    • 외부 클래스의 인스턴스와 독립적으로 동작해야 할 때
    • 외부 클래스의 static 멤버만 필요할 때
    • 메모리 사용을 최적화하고 싶을 때

🎯 정리

내부 클래스(Inner Class)외부 클래스 인스턴스 필요, 외부 클래스의 모든 멤버 접근 가능.
정적 중첩 클래스(Static Nested Class)외부 클래스 인스턴스 없이 사용 가능, static 멤버만 접근 가능.

* 상황에 맞게 내부 클래스와 정적 중첩 클래스를 적절히 활용하면, 코드의 가독성과 효율성이 향상됩니다!

728x90