| 종류 | 특징 |
|---|---|
| 1. 인스턴스 내부 클래스 | 외부 클래스의 인스턴스가 있어야 생성 및 사용 가능. |
| 2. 정적 내부 클래스 | 외부 클래스의 인스턴스 없이 생성 및 사용 가능. static 키워드로 선언. |
| 3. 지역 내부 클래스 | 메서드 내부에 정의되며, 메서드 실행 시에만 사용 가능. |
| 4. 익명 내부 클래스 | 클래스 이름 없이 선언과 동시에 인스턴스를 생성. 인터페이스나 추상 클래스의 구현체를 즉석에서 정의할 때 주로 사용. |

public class OuterClass {
private String outerField = "외부 클래스 필드";
// 인스턴스 내부 클래스
public class InnerClass {
public void display() {
System.out.println("외부 필드: " + outerField);
}
}
}
// 사용 예
public class Main {
public static void main(String[] args) {
OuterClass outer = new OuterClass();
OuterClass.InnerClass inner = outer.new InnerClass(); // 외부 클래스의 인스턴스를 통해 내부 클래스 생성
inner.display();
}
}
public class OuterClass {
private static String staticField = "정적 외부 필드";
// 정적 내부 클래스
public static class StaticInnerClass {
public void display() {
System.out.println("정적 필드: " + staticField);
}
}
}
// 사용 예
public class Main {
public static void main(String[] args) {
OuterClass.StaticInnerClass inner = new OuterClass.StaticInnerClass(); // 외부 클래스의 인스턴스 없이 생성 가능
inner.display();
}
}
public class OuterClass {
public void methodWithLocalClass() {
class LocalInnerClass { // 지역 내부 클래스
public void display() {
System.out.println("지역 내부 클래스입니다.");
}
}
LocalInnerClass localInner = new LocalInnerClass();
localInner.display();
}
}
// 사용 예
public class Main {
public static void main(String[] args) {
OuterClass outer = new OuterClass();
outer.methodWithLocalClass();
}
}
public interface MyInterface {
void execute();
}
public class Main {
public static void main(String[] args) {
// 익명 내부 클래스
MyInterface instance = new MyInterface() {
@Override
public void execute() {
System.out.println("익명 내부 클래스에서 실행합니다.");
}
};
instance.execute();
}
}
final 또는 사실상 final 변수만 사용할 수 있습니다. (Java 8 이후부터는 "사실상 final"도 허용)| 내부 클래스 종류 | 특징 | 사용 예 |
|---|---|---|
| 인스턴스 내부 클래스 | 외부 클래스의 인스턴스를 통해 생성 및 사용 가능. | 외부 클래스와 강하게 연관된 부가 기능을 정의할 때. |
| 정적 내부 클래스 | 외부 클래스의 인스턴스 없이 생성 및 사용 가능. static 키워드로 선언. | 외부 클래스와 독립적으로 동작할 수 있는 기능을 정의할 때. |
| 지역 내부 클래스 | 메서드 내부에 정의되며, 메서드 실행 중에만 사용 가능. | 특정 메서드에서만 필요한 클래스를 정의할 때. |
| 익명 내부 클래스 | 클래스 이름 없이 선언과 동시에 객체 생성. 주로 인터페이스나 추상 클래스 구현체로 사용. | 이벤트 리스너와 같은 단발성 구현체가 필요할 때. |
내부 클래스는 캡슐화, 가독성, 논리적 그룹화를 위해 효과적으로 사용할 수 있지만, 과도한 사용은 오히려 코드의 복잡성을 증가시킬 수 있으므로 필요한 경우에만 적절히 사용하는 것이 좋습니다.