자바

Java 중첩 클래스와 중첩 인터페이스 완전 정리

a-bell2 2025. 6. 5. 16:48

📌 Java 중첩 클래스와 중첩 인터페이스 완전 정리

자바에서는 클래스 안에 또 다른 클래스를 선언할 수 있습니다. 이러한 구조를 **중첩 클래스(Nested Class)**라고 하며, 경우에 따라선 인터페이스도 내부에 선언할 수 있는데, 이를 중첩 인터페이스라고 부릅니다.

이 문서에서는 중첩 클래스와 인터페이스의 종류, 구조적 이점, 그리고 활용 이유에 대해 알아봅니다.


🔷 중첩 클래스란?

클래스 안에 정의된 또 다른 클래스

class Outer {
    class Inner {
        // 내부 클래스 정의
    }
}

자바에서는 중첩 클래스의 위치나 성격에 따라 크게 다음과 같이 나뉩니다.

구분  위치  특징
인스턴스 멤버 클래스 외부 클래스 내부, static 없이 외부 클래스 인스턴스가 있어야 생성 가능
정적(static) 멤버 클래스 외부 클래스 내부, static 키워드 포함 외부 인스턴스 없이도 독립 생성 가능
로컬 클래스 메소드나 생성자 내부 해당 블록 안에서만 사용 가능

📍 중첩 클래스의 장점

목적  이유
캡슐화 외부에 필요 없는 클래스를 감춰서 구조를 단순화
응집도 향상 특정 클래스에만 관련된 기능을 내부에 집중
코드 가독성 증가 구조가 논리적으로 정리됨
불필요한 클래스 노출 방지 의미 없는 외부 접근을 차단
이벤트 처리에 적합 스레드나 GUI 이벤트 처리를 위한 일회성 구현에 적합

🔶 인스턴스 멤버 클래스

  • static 없이 선언된 내부 클래스
  • 외부 클래스 인스턴스에 의존적
  • 외부 클래스의 모든 필드, 메소드 접근 가능
  • 보통 외부 클래스 내부에서 생성해서 사용함
public class Outer {
    private String message = "Hello";

    class Inner {
        void showMessage() {
            System.out.println(message);
        }
    }

    void execute() {
        Inner inner = new Inner();
        inner.showMessage();
    }
}

🔷 정적(static) 멤버 클래스

  • static 키워드 사용
  • 외부 클래스 인스턴스 없이도 사용 가능
  • 외부 클래스의 정적 멤버만 접근 가능
public class Car {
    static String brand = "Hyundai";

    static class Engine {
        void start() {
            System.out.println("Starting... " + brand);
        }
    }
}

🔹 로컬 클래스

메소드나 생성자 내부에 정의되는 클래스

  • 접근제한자 불가 (private, public 등 X)
  • static 선언 불가
  • effectively final인 지역 변수만 접근 가능 (자바 8부터)
void runTask() {
    int count = 10;

    class Task {
        void print() {
            System.out.println(count);
        }
    }

    Task task = new Task();
    task.print();
}

🔶 중첩 클래스와 바깥 클래스의 관계

내부 클래스 종류  바깥 인스턴스 필요  바깥 멤버 접근
인스턴스 클래스 필요함 인스턴스 + 정적 모두 접근 가능
정적 클래스 불필요 정적 멤버만 접근 가능
로컬 클래스 블록 안에서만 접근 가능 지역 변수는 final 또는 effectively final일 때만 접근 가능

✅ 중첩 인터페이스란?

클래스 내부에 선언된 인터페이스

class Button {
    interface OnClickListener {
        void onClick();
    }
}

🔸 중첩 인터페이스 사용하는 이유

  • 외부에서 특정 조건을 만족한 구현체만 사용하도록 제한
  • 관련 클래스에만 밀접하게 결합되도록 설계 가능
  • UI 이벤트 리스너, 콜백 인터페이스 등에 활용
public class Button {
    public static interface OnClickListener {
        void onClick();
    }

    private OnClickListener listener;

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

    public void click() {
        if (listener != null) {
            listener.onClick();
        }
    }
}

📍 사용 예시

public class MyListener implements Button.OnClickListener {
    public void onClick() {
        System.out.println("버튼 클릭됨!");
    }
}

public class Main {
    public static void main(String[] args) {
        Button button = new Button();
        button.setOnClickListener(new MyListener());
        button.click(); // 출력: 버튼 클릭됨!
    }
}

🧩 마무리 정리

개념  설명
중첩 클래스 클래스 내부에 선언된 클래스 (멤버, 로컬, 정적)
중첩 인터페이스 클래스 내부에 선언된 인터페이스
응집도 향상 관련 기능을 한 곳에 묶어 관리
캡슐화 강화 외부에 불필요한 클래스 노출 방지
이벤트 처리 익명 클래스나 로컬 클래스 사용 가능

🎯 핵심 한 줄 요약

“중첩 클래스와 중첩 인터페이스는 관련 기능을 논리적으로 묶어 응집도를 높이고, 외부와의 결합을 줄이는 객체지향 설계 도구다.”