내부 클래스 개요
내부 클래스는 하나의 클래스 안에 다른 클래스(인터페이스, 열거형, 애노테이션 포함)를 정의하는 구조입니다. 이는 코드의 구조적 분리와 캡슐화를 강화하며, 특정 영역에서만 사용되는 클래스를 효과적으로 관리할 수 있게 해줍니다.
내부 클래스의 유형
1. 멤버 내부 클래스 (Member Inner Class)
외부 클래스 내부에 정의되며 static 키워드로 선언되지 않은 클래스입니다. 외부 클래스의 인스턴스 멤버에 접근할 수 있으며, 생성 시 외부 클래스의 인스턴스가 필요합니다.
public class Outer {
private int value = 100;
class Inner {
public void display() {
System.out.println("Outer value: " + value);
}
}
public void createInner() {
Inner inner = new Inner();
inner.display();
}
public static void main(String[] args) {
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
inner.display(); // 출력: Outer value: 100
}
}
2. 지역 내부 클래스 (Local Inner Class)
메서드나 블록 내부에서 정의되며, 해당 블록 외부에서는 접근 불가능합니다. 지역 변수는 final이거나 컴파일 타임 상수여야 합니다.
public class Calculator {
public void calculate(int input) {
final String message = "계산 결과: ";
class ResultPrinter {
public void print() {
System.out.println(message + input * 2);
}
}
new ResultPrinter().print();
}
public static void main(String[] args) {
Calculator calc = new Calculator();
calc.calculate(5); // 출력: 계산 결과: 10
}
}
3. 익명 내부 클래스 (Anonymous Inner Class)
클래스 정의와 인스턴스 생성을 동시에 수행하는 방식으로, 이름 없이 한 번 사용된 클래스를 정의할 때 유용합니다. 주로 인터페이스 또는 추상 클래스를 확장할 때 사용됩니다.
interface Greeting {
void sayHello(String name);
}
public class AnonymousDemo {
public static void main(String[] args) {
Greeting greet = new Greeting() {
@Override
public void sayHello(String name) {
System.out.println("안녕하세요, " + name + "님!");
}
};
greet.sayHello("김철수");
}
}
4. 정적 내부 클래스 (Static Nested Class)
외부 클래스 내부에 static으로 선언된 클래스입니다. 외부 클래스의 인스턴스 없이도 직접 생성 가능하며, 외부 클래스의 정적 멤버만 참조할 수 있습니다.
public class UtilityClass {
private static String config = "default";
static class Helper {
public void showConfig() {
System.out.println("설정값: " + config);
}
}
public static void main(String[] args) {
UtilityClass.Helper helper = new UtilityClass.Helper();
helper.showConfig(); // 출력: 설정값: default
}
}
주요 특징 요약
- 멤버 내부 클래스: 외부 인스턴스 의존,
this로 외부 클래스 접근 가능 - 지역 내부 클래스: 블록 범위 내에서만 유효,
final변수만 참조 가능 - 익명 내부 클래스: 단일 사용 용도, 인터페이스/추상 클래스 확장에 적합
- 정적 내부 클래스: 외부 인스턴스 없이 생성 가능, 정적 멤버만 접근 가능