1. 내부 클래스 (Inner Class)
자바의 내부 클래스(Inner Class)는 클래스 내부에 또 다른 클래스를 선언할 수 있는 기능으로, 논리적으로 연관된 클래스들을 한곳에 묶어 관리할 수 있도록 도와줍니다. 또한 외부 클래스의 멤버에 대한 접근이 용이하기 때문에 이벤트 핸들러, 콜백 처리, UI 개발 등 다양한 곳에서 활용됩니다.
1. 인스턴스 내부 클래스
외부 클래스의 인스턴스에 종속되어 동작하는 클래스입니다. 일반적으로 외부클래스의 보조적인 역할을 수행하기 위해 작성되며, 내부클래스 객체 생성은 보통 외부클래스안에서만 이루어집니다.
🔹 특징
외부 클래스의 필드, 메서드에 접근 가능
외부 클래스에 종속되며 보조적인 역할을 수행
반드시 외부 클래스의 객체를 통해 생성
🔹 예시
public class Outer {
private String message = "Hello from Outer";
private class Inner {
public void print() {
System.out.println(message); // 외부 클래스 message에 접근
}
}
private Inner innerClass;
public Outer(){
innerClass = new Inner();
}
}
2. 정적 내부 클래스
정적(static)으로 선언된 내부 클래스로, 외부 클래스 인스턴스 없이도 사용 가능합니다.
🔹 특징
외부클래스의 정적 필드와 동일하게 취급되며 외부클래스에 종속적이지 않습니다.
외부 클래스의 static 멤버에만 접근 가능(외부 클래스의 인스턴스 변수에는 직접 접근 불가)
일반적으로 DTO, Builder, enum 등 구조적 클래스(데이터저장구조)에서 많이 사용
🔹 예시
public class Container {
public static class StaticInner {
public static void print() {
System.out.println("I'm static inner");
}
}
}
🔹 사용법
외부클래스명.정적내부클래스명.메서드명();
Container.StaticInner.print();
3. 지역 내부 클래스
메서드, 생성자, 초기화 블록등 블록 내부에서 정의도는 클래스로 임시로 사용할 클래스를 정의할 때 사용합니다.
🔹 특징
선언된 메서드 또는 블록 내에서만 사용 가능합니다.
로컬변수 사용시 반드시 final 또는 effectively final(선언 이후 값을 변경하지 않는 변수)로 사용해야 합니다.
final키워드의 변수들은 JVM이 상수 풀 영역 (constant pool) 에 저장하여 원본 변수의 변경 가능성을 제거하여 스레드의 안전성을 보장합니다.
외부 클래스의 변수에 자유롭게 접근할 수 있습니다.
🔹 예시
public void example() {
class Local {
public void print() {
System.out.println("I'm local inner class");
}
}
Local local = new Local();
local.print();
}
4. 익명 내부 클래스
이름 없이 선언과 동시에 인스턴스를 생성하는 클래스입니다. 인터페이스나 추상 클래스의 구현체가 필요한 곳에서 간단하게 구현할 때 사용됩니다.
🔹 특징
선언과 동시에 인스턴스 생성
이름이 없음
클래스를 1회용으로 사용할 때 유용함(번거로운 클래스 선언문 x)
람다 이전까지 많이 사용
🔹 예시
Runnable r = new Runnable() {
@Override
public void run() {
System.out.println("Running in anonymous inner class");
}
};
r.run();
정리
인스턴스 내부 클래스
외부 인스턴스를 통해 생성
O
외부 객체와 강결합 필요 시
정적 내부 클래스
외부 클래스 이름으로 생성
static 멤버만
구조적 클래스, 정적 도우미
지역 내부 클래스
메서드 내에서 정의/사용
O
메서드 스코프에서 한정적 사용
익명 내부 클래스
즉시 구현 및 사용
O
일회용 인터페이스 구현
Last updated