Backend/Java

내부 클래스 (Inner Class)

개발자의 첫 걸음 2025. 7. 27. 10:00

 

 

 

안녕하세요 오늘은 내부 클래스 (Inner Class)에 알아볼게요.

 

 

 

 

내부 클래스

 

내부 클래스 중첩 클래스라고도 불리는데

 

즉, 다른 클래스 내부에 정의된 클래스를 말해요.

 

내부 클래스의 사용함으로 코드의 구조 파익이 용이하고,

(코드 가독성 향상)

 

외부에 공대할 필요가 없는 클래스는 내부로 감출 수 있어요.

(캡슐화 강화)

 

그리고 내부 클래스는 외부 클래스와 필드와 메서드에 직접 접근이 가능해요.

(외부 클래스 멤버 접근)

 

 

내부클래스는의 종류는

 

비정적 내부 클래스, 정적 내부클래스, 메서드 내부 클래스, 익명(내부) 클래스 

 

총 네 가지가 있어요.

 

그럼 내부 클래스의 종류에 대해 간단히 알아볼까요?

 

 

 

비정적 내부 클래스(인스턴스)

(Non-static Inner Class)

 

비정적 내부 클래스는 "외부 클래스의 인스턴스"에 속하는 친구예요.

 

그리고 외부 클래스의 인스턴스를 먼저 생성해야만 생성이 가능하고,

 

외부 클래스의 인스턴스 멤버(필드, 메서드)에 접근이 가능해요.

 

public class Outer {
    private String msg = "Hello";

    class Inner {
        void showMessage() {
            System.out.println(msg); // 외부 클래스 멤버 접근 가능
        }
    }

    public void createInner() {
        Inner in = new Inner();
        in.showMessage();
    }
}

// 사용 방법
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
inner.showMessage();

 

 

 

정적 내부 클래스

(Static Nested Class)

 

정적 내부 클래스는 "외부 클래스의 정적 멤버"에 속하는 친구예요

 

외부 클래스 인스턴스 없이 생성가능하고,

 

외부 클래스의 정적 멤버(static 멤버)에만 접근 가능해요

 

(인스턴스 X -> 비정적 내부 클래스와 달라요!)

public class Outer {
    static int num = 10;

    static class StaticInner {
        void display() {
            System.out.println("Number: " + num); // static 멤버 접근 가능
        }
    }
}

// 사용 방법
Outer.StaticInner inner = new Outer.StaticInner();
inner.display();​

 

 

 

메서드 내부 클래스

(Local Inner Class)

 

메서드 내부 클래스(지역 클래스)는 "메서드 내에서 정의된 내부 클래스"에요.

 

해당 메서드 내에서만 사용이 가능하고, 메서드의 지역변수에만 접근이 가능해요.

 

+) 로컬 변수(외부 클래스의 멤버 변수)가 final인 경우에만 접근이 가능!

 

public class Outer {
    void outerMethod() {
        int localVar = 5; // effectively final이어야 함

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

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

 

 

익명 내부 클래스

(Anonymous Inner Class)

 

익명 내부 클래스는 클래스 이름이 없는 "일회성 클래스"에요.

 

주로 인터페이스나 추상 클래스의 구현에 사용돼요.

 

익명 내부 클래스의 사용은 즉시 개체를 생성하고 싶을 때,

 

또는 일회성으로 사용하고 싶을 때 사용해요.

 

abstract class Animal {
    abstract void sound();
}

public class Test {
    public static void main(String[] args) {
        Animal dog = new Animal() {
            void sound() {
                System.out.println("멍멍!");
            }
        };

        dog.sound();
    }
}

 

 

 

여기까지 내부 클래스에 대한 특징과 종류를 알아봤는데요.

 

내부 클래스의 사용으로 외부 클래스와 서로 관련 있는 기능들을

 

더 깔끔하고 편하게 만들 수 있을 것 같아요.

 

'Backend > Java' 카테고리의 다른 글

스트림(Stream) API  (5) 2025.07.29
람다식(Lambda Expression)  (4) 2025.07.28
프레임워크(Framework)  (6) 2025.07.26
빌더(Builder)  (2) 2025.07.25
싱글톤 (Singleton)  (4) 2025.07.24