JAVA 80%

Nested class and Nested interface

lshjju 2025. 10. 8. 22:10

자바의 **중첩 클래스(Nested Class)**는 클래스 안에 또 다른 클래스를 숨겨두는 기법입니다.

마치 복합 가전제품 속에 작은 부품들이 들어있는 것처럼, 특정 클래스 내에서만 쓰이는 클래스를 밀접하게 관리하기 위해 사용합니다.



📘 중첩 클래스(Nested Class)의 세계

중첩 클래스는 크게 멤버 클래스로컬 클래스로 나뉩니다.

1. Member class (멤버 클래스)

  • 설명: 클래스의 멤버(필드, 메서드)처럼 클래스 내부에 선언된 클래스입니다.
  • 종류:
    • 인스턴스 멤버 클래스: 바깥 객체가 있어야만 생성 가능합니다.
    • 정적(static) 멤버 클래스: 바깥 객체 없이도 독립적으로 생성 가능합니다.
  • 비유: 자동차(바깥 클래스) 안의 엔진이나 타이어(멤버 클래스)와 같습니다.
Java
 
class Outer {
    // 1. 인스턴스 멤버 클래스
    class InstanceInner {
        void method() { System.out.println("인스턴스 멤버 클래스입니다."); }
    }

    // 2. 정적 멤버 클래스
    static class StaticInner {
        void method() { System.out.println("정적 멤버 클래스입니다."); }
    }
}

public class MemberClassExample {
    public static void main(String[] args) {
        // 인스턴스 멤버 클래스는 바깥 객체를 먼저 만들어야 합니다.
        Outer out = new Outer();
        Outer.InstanceInner inner = out.new InstanceInner();
        
        // 정적 멤버 클래스는 바로 만들 수 있습니다.
        Outer.StaticInner staticInner = new Outer.StaticInner();
    }
}

2. Local class (로컬 클래스)

  • 설명: 메서드 내부에서만 선언되고 사용되는 클래스입니다.
  • 비유: 특정 작업을 위해 잠시 빌려 쓰는 일회용 도구와 같습니다.
  • 특징: 메서드가 실행될 때만 존재하며, 메서드가 끝나면 사라집니다.
Java
 
class Outer {
    void method() {
        // 메서드 안에 클래스를 선언합니다.
        class LocalInner {
            void print() { System.out.println("로컬 클래스입니다."); }
        }
        
        // 메서드 안에서만 사용 가능합니다.
        LocalInner li = new LocalInner();
        li.print();
    }
}

3. Nested Interface (중첩 인터페이스)

  • 설명: 클래스 내부에 선언된 인터페이스입니다.
  • 비유: 가전제품의 버튼 조작 방식(인터페이스)을 그 제품(클래스) 안에 정의해두는 것입니다.
  • 활용: 주로 UI 이벤트 처리(버튼 클릭 등)에서 해당 클래스와 긴밀한 관계를 맺는 인터페이스를 만들 때 씁니다.
Java
 
class Button {
    // 중첩 인터페이스
    interface OnClickListener {
        void onClick();
    }

    OnClickListener listener;

    void setOnClickListener(OnClickListener listener) {
        this.listener = listener;
    }

    void touch() {
        listener.onClick();
    }
}

public class NestedInterfaceExample {
    public static void main(String[] args) {
        Button btn = new Button();
        // 중첩 인터페이스 구현
        btn.setOnClickListener(() -> System.out.println("버튼을 클릭했습니다!"));
        btn.touch();
    }
}

👨‍🏫 쉽게 이해하는 핵심 포인트

  1. 캡슐화: 외부에는 숨기고 싶은 클래스를 안에 넣음으로써 코드를 더 깔끔하게 관리할 수 있습니다.
  2. 접근성: 중첩 클래스는 바깥 클래스의 private 멤버에도 쉽게 접근할 수 있어 데이터 공유가 편리합니다.
  3. 정적(static)의 차이: static이 붙은 중첩 클래스는 바깥 클래스의 인스턴스 필드에 접근할 수 없다는 점을 주의하세요!

오늘의 요약

  • Member class: 클래스의 부품처럼 쓰이며, 위치에 따라 인스턴스/정적으로 나뉜다.
  • Local class: 메서드 안에서만 반짝 쓰이고 사라지는 일회용 클래스이다.
  • Nested Interface: 특정 클래스에 종속된 기능을 정의할 때 사용한다.

클래스 안에 클래스를 넣는 깊이 있는 구조까지 마스터하셨습니다!


'JAVA 80%' 카테고리의 다른 글

Collection framework  (0) 2025.11.05
Thread control  (0) 2025.11.05
java.util package  (0) 2025.11.05
java.lang package  (0) 2025.11.05
Anonymous object  (0) 2025.11.05