어제 오늘 내일

[Java] 내부 클래스(inner class) 종류와 사용법 본문

IT/Java

[Java] 내부 클래스(inner class) 종류와 사용법

hi.anna 2025. 12. 29. 00:22

Java의 내부 클래스(inner class)는 클래스 내부에 선언된 클래스로, 외부 클래스와 밀접한 연관이 있는 로직을 함께 묶어 관리할 때 사용됩니다.
내부 클래스는 외부 클래스의 멤버에 쉽게 접근할 수 있고, 구조를 논리적으로 그룹화하는 데 유용합니다. Java에서는 내부 클래스를 네 가지 형태로 제공합니다.

 

1. 멤버 내부 클래스 (Member Inner Class)

외부 클래스의 멤버 위치에 선언된 일반적인 내부 클래스입니다.
외부 클래스의 인스턴스 멤버에 자유롭게 접근할 수 있습니다.

예제

class Outer {
    private int value = 10;

    class Inner {
        void print() {
            System.out.println("value = " + value); // 외부 변수 접근 가능
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Outer outer = new Outer();
        Outer.Inner inner = outer.new Inner(); // 생성 방법
        inner.print();
    }
}

특징

  • 외부 클래스의 인스턴스를 기반으로 해야 객체 생성 가능
  • 외부 클래스 멤버에 접근 쉬움

 

2. 정적(static) 내부 클래스 (Static Nested Class)

static으로 선언된 내부 클래스로, 외부 클래스의 인스턴스 없이 사용 가능합니다.
일반 내부 클래스와 달리 외부 클래스의 인스턴스 멤버에는 접근할 수 없습니다.

예제

class Outer {
    static class Inner {
        void hello() {
            System.out.println("Static Inner Class");
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Outer.Inner inner = new Outer.Inner(); // 외부 인스턴스 없이 생성
        inner.hello();
    }
}

특징

  • 외부 클래스의 static 멤버만 접근 가능
  • 내부 클래스 중 가장 독립성이 강함

 

3. 지역(Local) 내부 클래스

메서드 내부에 선언되는 클래스이며, 메서드 내에서만 사용 가능합니다.

예제

class Outer {
    void doSomething() {
        int num = 10;

        class LocalInner {
            void print() {
                System.out.println("num = " + num);
            }
        }

        LocalInner inner = new LocalInner();
        inner.print();
    }
}

특징

  • 메서드 안에서만 사용 가능
  • 메서드의 지역 변수는 실질적 final이어야 접근 가능

 

4. 익명 클래스 (Anonymous Inner Class)

클래스를 별도로 선언하지 않고, 일회성 객체를 만들 때 사용합니다.
주로 인터페이스 구현 또는 메서드 오버라이딩에 자주 사용됩니다.

예제

interface Greeting {
    void hello();
}

public class Main {
    public static void main(String[] args) {
        Greeting g = new Greeting() {
            @Override
            public void hello() {
                System.out.println("Hello from Anonymous Class");
            }
        };

        g.hello();
    }
}

특징

  • 이름 없는 클래스
  • 코드 간결
  • 이벤트 처리, 콜백 등에 자주 활용

 

5. 내부 클래스 사용을 고려하는 이유

✔ 외부 클래스와 강한 연관성이 있을 때

논리적으로 하나의 그룹으로 묶어 관리하기 좋음

✔ 캡슐화 향상

외부에서 사용할 필요 없는 클래스는 내부에 숨길 수 있음

✔ UI 이벤트 처리, 콜백 구조에서 편리

특히 익명 클래스는 짧은 코드로 동작 정의 가능

 

6. 네 가지 내부 클래스 비교

유형 선언위치 외부클래스 접근 객체 생성 방식
멤버 내부 클래스 외부 클래스 멤버 인스턴스 멤버 접근 가능 outer.new Inner()
정적 내부 클래스 static 멤버처럼 선언 static 멤버만 접근 가능 new Outer.Inner()
지역 내부 클래스 메서드 내부 지역 변수(final) 접근 가능 메서드 내에서만 생성
익명 클래스 표현식에서 즉시 생성 상속/구현 기반 일회성 객체 생성

 

7. 정리

  • 내부 클래스는 외부 클래스와 논리적으로 연결된 클래스를 내부에 정의하는 방식
  • 종류: 멤버 내부 클래스, 정적 내부 클래스, 지역 내부 클래스, 익명 클래스
  • 각각 목적과 활용 방식이 다르므로 상황에 맞게 선택
  • 특히 익명 클래스는 짧고 간결한 동작 정의에 매우 편리

 

반응형
Comments