Java의 중첩 클래스(Nested Class), 내부 클래스(Inner Class), 지역 클래스(Local Class) 정리
Java에서는 클래스 안에 또 다른 클래스를 선언할 수 있음. 이를 중첩 클래스(Nested Class) 라고 부름.
중첩 클래스는 코드의 구조를 더 논리적으로 구성할 수 있도록 도와줌.
1. 중첩 클래스란?
중첩 클래스(Nested Class) 는 다른 클래스 내부에 선언된 클래스를 의미함.
일반 클래스 외에, 클래스의 일부 기능을 내부 클래스로 구조화할 때 사용함.
중첩 클래스는 다음과 같이 크게 두 가지로 나뉨:
- 정적 중첩 클래스 (Static Nested Class)
 - 비정적 중첩 클래스 → 내부 클래스(Inner Class)
 
내부 클래스는 다시 세분화됨:
| 분류 | static 여부 | 선언 위치 | 
| 정적 중첩 클래스 | 있음 | 클래스 내부 | 
| 내부 클래스 | 없음 | 클래스 내부 | 
| 지역 클래스 | 없음 | 메서드, 블록 내부 | 
| 익명 클래스 | 없음 | 메서드, 블록 내부 | 
2. 정적 중첩 클래스 (Static Nested Class)
개념
- static 키워드로 선언된 중첩 클래스
 - 외부 클래스의 인스턴스 없이도 사용 가능함
 - 외부 클래스의 정적 멤버(static field/method) 에만 접근 가능함
 
예시
public class Outer {
    static int staticValue = 100;
    static class StaticNested {
        void show() {
            System.out.println("Static value = " + staticValue);
        }
    }
}
Outer.StaticNested nested = new Outer.StaticNested();
nested.show();
3. 내부 클래스 (Inner Class)
개념
- static 없이 외부 클래스 안에 선언된 클래스
 - 외부 클래스의 모든 멤버(필드, 메서드 포함) 에 접근 가능함
 - 내부 클래스는 반드시 외부 클래스의 인스턴스가 존재해야 생성 가능함
 
예시
public class Outer {
    private String message = "Hello from Outer";
    class Inner {
        void printMessage() {
            System.out.println(message);
        }
    }
}
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
inner.printMessage();
4. 지역 클래스 (Local Class)
개념
- 메서드, 생성자, 초기화 블록 안에서 선언되는 클래스
 - 해당 블록 내에서만 유효함 (지역 변수처럼 동작)
 - 외부 클래스의 필드, 메서드에 접근 가능
 - 메서드 내 지역 변수에 접근할 경우, 해당 변수는 final 또는 effectively final 이어야 함
 
예시
public class Outer {
    void doTask() {
        int taskId = 10; // final처럼 사용되어야 함
        class LocalClass {
            void print() {
                System.out.println("Task ID: " + taskId);
            }
        }
        LocalClass lc = new LocalClass();
        lc.print();
    }
}
5. 익명 클래스 (Anonymous Class)
개념
- 이름 없이 클래스를 선언하고 즉시 객체로 생성함
 - 인터페이스나 추상 클래스의 구현이 필요할 때 자주 사용됨
 - 지역 클래스와 비슷하지만 한 번만 사용되는 간단한 용도에 적합함
 
예시
Runnable r = new Runnable() {
    @Override
    public void run() {
        System.out.println("Running");
    }
};
new Thread(r).start();
6. 네 가지 중첩 클래스 비교 요약
| 구분 | 선언 위치 | 외부 멤버 접근 | static 여부 | 사용 시기 | 
| 정적 중첩 클래스 | 클래스 내부 | 정적 멤버만 접근 | static 있음 | 외부 인스턴스 없이 사용 시 | 
| 내부 클래스 | 클래스 내부 | 모두 접근 가능 | static 없음 | 외부 인스턴스 필요 | 
| 지역 클래스 | 메서드/블록 내부 | 일부 접근 가능 | static 없음 | 특정 메서드 내에서만 사용 | 
| 익명 클래스 | 메서드/블록 내부 | 일부 접근 가능 | static 없음 | 일회성 인터페이스 구현 시 | 
7. 정리
- 중첩 클래스는 코드의 논리적 구성을 돕고 캡슐화를 강화함
 - 내부 클래스는 외부 인스턴스와 강하게 연결되므로 주의가 필요함
 - 지역 클래스와 익명 클래스는 메서드 내 일시적 기능 구현에 적합함
 - 정적 중첩 클래스는 외부 인스턴스에 의존하지 않아 독립적으로 사용 가능함
 
출처 : ChatGPT
'BE > Java' 카테고리의 다른 글
| [Java] 제네릭 vs 와일드카드 (0) | 2025.09.04 | 
|---|---|
| 변수 정리 (3) | 2025.07.22 | 
| LocalDate.parse(입력문자,포맷); (1) | 2025.05.29 | 
| date.format() (0) | 2025.05.28 | 
| DateTimeFormatter.ofPattern (0) | 2025.05.27 |