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