📌 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(); // 출력: 버튼 클릭됨!
}
}
🧩 마무리 정리
개념 | 설명 |
중첩 클래스 | 클래스 내부에 선언된 클래스 (멤버, 로컬, 정적) |
중첩 인터페이스 | 클래스 내부에 선언된 인터페이스 |
응집도 향상 | 관련 기능을 한 곳에 묶어 관리 |
캡슐화 강화 | 외부에 불필요한 클래스 노출 방지 |
이벤트 처리 | 익명 클래스나 로컬 클래스 사용 가능 |
🎯 핵심 한 줄 요약
“중첩 클래스와 중첩 인터페이스는 관련 기능을 논리적으로 묶어 응집도를 높이고, 외부와의 결합을 줄이는 객체지향 설계 도구다.”
'자바' 카테고리의 다른 글
자바 예외 처리 완전 정리 (0) | 2025.06.05 |
---|---|
자바 익명 객체 완전 정리 (0) | 2025.06.05 |
자바 인터페이스와 다형성 쉽게 정리하기 (2) | 2025.06.05 |
자바 인터페이스 완전 정리 (초보도 이해하는 구조 중심 해설) (0) | 2025.06.04 |
자바 추상 클래스 완전 정리 (1) | 2025.06.04 |