자바 내부 클래스의 종류와 활용

내부 클래스 개요

내부 클래스는 하나의 클래스 안에 다른 클래스(인터페이스, 열거형, 애노테이션 포함)를 정의하는 구조입니다. 이는 코드의 구조적 분리와 캡슐화를 강화하며, 특정 영역에서만 사용되는 클래스를 효과적으로 관리할 수 있게 해줍니다.

내부 클래스의 유형

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 변수만 참조 가능
  • 익명 내부 클래스: 단일 사용 용도, 인터페이스/추상 클래스 확장에 적합
  • 정적 내부 클래스: 외부 인스턴스 없이 생성 가능, 정적 멤버만 접근 가능

태그: java 내부 클래스 익명 클래스 정적 중첩 클래스 지역 내부 클래스

6월 17일 21:59에 게시됨