JAVA

중첩 클래스(Nested Class)

neal89 2025. 3. 3. 13:01


✅ 1. 중첩 클래스(Nested Class) 개요

종류 특징 외부 클래스 인스턴스 필요 여부 주요 사용 목적

정적 중첩 클래스 (Static Nested Class) static 키워드를 사용하여 정의됨, 외부 클래스의 인스턴스 없이 독립적으로 사용 가능 ❌ 필요 없음 외부 클래스와 관련은 있지만, 독립적인 기능을 수행해야 할 때
내부 클래스 (Inner Class) static이 없는 중첩 클래스, 외부 클래스의 인스턴스 필요 ✅ 필요함 외부 클래스의 인스턴스와 긴밀하게 연관된 작업 수행
지역 클래스 (Local Class) 메서드 내부에서 정의되는 내부 클래스 ✅ 필요함 특정 메서드 내에서만 사용해야 할 때
익명 클래스 (Anonymous Class) 클래스 이름 없이 한 번만 사용될 클래스 정의 및 생성 ✅ 필요함 일회성 사용, 인터페이스 또는 추상 클래스의 간단한 구현

✅ 2. 중첩 클래스, 내부 클래스, 익명 클래스의 차이점

특징 정적 중첩 클래스 내부 클래스 지역 클래스 익명 클래스

외부 클래스 인스턴스 필요 여부 ❌ 필요 없음 ✅ 필요함 ✅ 필요함 ✅ 필요함
정의 위치 외부 클래스 내부 외부 클래스 내부 메서드 내부 메서드 내부 (선언과 생성 동시에)
이름 존재 여부 ✅ 있음 ✅ 있음 ✅ 있음 ❌ 없음
사용 목적 독립적 기능 수행 외부 클래스와 긴밀한 관계 특정 메서드 내부에서만 사용 인터페이스/추상 클래스 즉시 구현
재사용 가능 여부 ✅ 가능 ✅ 가능 ❌ 불가능 (메서드 내에서만 사용) ❌ 불가능 (일회성)

✅ 3. 각 클래스의 장점과 단점

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

장점

  • 외부 클래스의 인스턴스 없이 독립적으로 사용 가능 → 메모리 절약
  • 외부 클래스와 관련이 있지만, 특정 데이터를 공유할 필요 없는 경우 유용
  • 외부 클래스의 static 멤버에만 접근 가능 → 명확한 의존성

단점

  • 외부 클래스의 인스턴스 멤버에 접근할 수 없음
  • 내부 클래스보다 상대적으로 덜 유연함

📌 예제

class Outer {
    static class StaticNested {
        void display() {
            System.out.println("Static Nested Class");
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Outer.StaticNested nested = new Outer.StaticNested();
        nested.display();
    }
}

외부 클래스의 인스턴스 없이 바로 사용 가능 🚀


📌 2️⃣ 내부 클래스 (Inner Class)

장점

  • 외부 클래스의 인스턴스 멤버에 접근 가능 → 바깥 클래스의 데이터와 강하게 연관된 경우 유용
  • 캡슐화 효과 → 내부 구현을 감출 수 있음

단점

  • 외부 클래스의 인스턴스가 필요하므로 메모리 소비 증가
  • 코드 가독성이 떨어질 수 있음

📌 예제

class Outer {
    private int outerValue = 10;

    class Inner {
        void display() {
            System.out.println("Outer Value: " + outerValue);
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Outer outer = new Outer();
        Outer.Inner inner = outer.new Inner();
        inner.display();
    }
}

외부 클래스의 멤버에 접근 가능! 🚀


📌 3️⃣ 지역 클래스 (Local Class)

장점

  • 특정 메서드 내에서만 사용 → 코드의 응집력 증가
  • 외부 클래스의 인스턴스 멤버 및 메서드 지역 변수 접근 가능

단점

  • 지역 변수 캡처: 접근하는 지역 변수는 final 또는 effectively final이어야 함
  • 재사용 불가능: 특정 메서드 내에서만 존재

📌 예제

class Outer {
    void process() {
        class Local {
            void display() {
                System.out.println("Local Class");
            }
        }
        Local local = new Local();
        local.display();
    }
}

public class Main {
    public static void main(String[] args) {
        Outer outer = new Outer();
        outer.process();
    }
}

메서드 내에서만 사용 가능하며, 필요할 때만 정의하여 사용 가능! 🚀


📌 4️⃣ 익명 클래스 (Anonymous Class)

장점

  • 코드 간결화 → 한 번만 사용할 클래스를 별도로 정의할 필요 없음
  • 인터페이스 및 추상 클래스 즉시 구현 가능

단점

  • 이름이 없으므로 재사용 불가능
  • 생성자가 없음 (기본 생성자만 가능)
  • 코드가 너무 길어질 경우 가독성이 떨어질 수 있음

📌 예제

interface Greeting {
    void sayHello();
}

public class Main {
    public static void main(String[] args) {
        Greeting greeting = new Greeting() { // 익명 클래스
            @Override
            public void sayHello() {
                System.out.println("Hello from Anonymous Class!");
            }
        };
        greeting.sayHello();
    }
}

한 번만 사용할 경우 매우 유용! 🚀


✅ 4. 언제 어떤 중첩 클래스를 사용해야 할까?

사용 상황 추천 중첩 클래스

외부 클래스와 관련 있지만 독립적으로 동작해야 할 때 정적 중첩 클래스 (Static Nested Class)
외부 클래스의 인스턴스 변수와 강하게 연관되어 있을 때 내부 클래스 (Inner Class)
특정 메서드 내에서만 사용될 필요가 있을 때 지역 클래스 (Local Class)
한 번만 사용할 간단한 클래스가 필요할 때 익명 클래스 (Anonymous Class)

🚀 결론

정적 중첩 클래스: 외부 클래스의 인스턴스 없이 사용 가능 → 독립적 기능
내부 클래스: 외부 클래스의 인스턴스가 필요 → 강한 연관 관계
지역 클래스: 특정 메서드 내에서만 사용 → 재사용 불필요한 경우
익명 클래스: 일회성 구현이 필요할 때 → 코드 간결화

'JAVA' 카테고리의 다른 글

daemon thread  (0) 2025.03.07
What happens if you call run() instead of thread.start()?  (0) 2025.03.07
instance methods & static methods in generic methods  (0) 2025.03.07
Generic  (0) 2025.03.07
try-with-resources vs try-catch-finally  (0) 2025.03.05