최원종의 개발 블로그

Inner class(중첩 클래스) 본문

Java/JAVA 유용한 클래스

Inner class(중첩 클래스)

chl6698 2026. 3. 12. 16:37

내부 클래스 (inner class)

  • 자바에서 내부 클래스는 한 클래스 내부에 선언된 클래스를 말함.
  • 내부 클래스를 선언하게 되면 내부 클래스와 외부 클래스라고 표현 가능
  • 내부 클래스는 보통 외부 클래스와 연관이 있는 경우가 많고,
  • 다른 곳에서 거의 사용할 일이 없는 경우에 내부 클래스를 선언해서 활용.

코드

package innerclass;

public class OuterClass1 {

    private int num = 10;
    // 클래스 파일안에 내부에 또 클래스 선언 (중첩클래스) // 인스턴스 내부 클래스
    class InnerClass {
        public void display() {
            System.out.println("num : " + num);
        }
    }
} // end of outer class

 

-Main1

package innerclass;

public class Main1 {

    public static void main(String[] args) {
        // 내부 클래스가 일반 멤버 클래스로 설계된 경우
        // 외부 클래스 객체가 생성되고 내부 클래스를 생성할 수 있다.
        OuterClass1 outerClass = new OuterClass1();
        OuterClass1.InnerClass innerClass = outerClass.new InnerClass();
        innerClass.display();
    }
}

 


내부 클래스의 종류

 

1. 멤버 내부 클래스: (Member Inner Class): 외부 클래스의 필드와 같은 위치에 선언되며, 외부 클래스의 인스턴스에 종속적.

멤버 내부 클래스의 인스턴스는 외부 클래스의 인스턴스가 있어야 생성할 수 있다.

 

2. 정적 내부 클래스: (Static Inner Class): 외부 클래스의 필드에 선언되지만, static 키워드를 사용하여 선언됨. 정적 내부 클래스는 외부 클래스의 인스턴스와 독립적으로 존재할 수 있으며, 주로 관련 있는 클래스들을 논리적으로 그룹화할 때 사용된다.

 

3. 지역 내부 클래스: (Local Inner Class): 메서드 내부에 선언되며, 선언된 메서드 내에서만 사용됨. 지역 내부 클래스는 해당 메서드의 지역 변수와 마찬가지로 스코프가 제한된다.

 

4. 익명 내부 클래스: (Anonymous Inner Class): 이름이 없는 내부 클래스로, 주로 인터페이스나 추상 클래스를 간편하게 구현할 때 사용됨. 익명 내부 클래스는 오직 하나의 인스턴스만 생성할 수 있으며, 주로 이벤트 처리나 콜백 구현에 사용된다.


-정적 내부 클래스 코드

package innerclass;

public class OuterClass2 {
    private static int num = 10;
    // 정적 내부 클래스
    static class InnerClass {
        public void display() {
            System.out.println("num : " + num);
        }
    }
} // end of outer class

 

-Main2

package innerclass;

public class Main2 {

    public static void main(String[] args) {
        // 경우1
        // Inner Class 일반 멤버 클래스로 설계된 경우
        // 인스턴스 내부 클래스(기본)
        // - 외부 클래스와 강하게 연결됨 상태
        // - 외부 객체가 있어야 내부 객체를 호출할 수 있음.

        // 경우 2
        // static Inner Class 정적 클래스로 설계된 경우
        // - 외부 클래스와 이름만 묶인 상태
        // - 외부 객체 생성없이도 생성 가능
        OuterClass2.InnerClass inner = new OuterClass2.InnerClass();
        inner.display();

    }
}

 

정적 내부 클래스 연습 코드

package innerclass;

// 정적 내부 클래스 연습
public class Spaceship {

    private Engine engine;

    // 엔진을 추가한다
    public void addEngine(Engine engine) {
        this.engine = engine;
    }

    public void startSpaceShip() {
        if(engine == null) {
            System.out.println("엔진을 먼저 장착해주세요");
        } else {
            System.out.println("우주여행을 출발 합니다");
        }
    }

    // 논리적으로 강하게 그룹화 시킬 때 내부 클래스를 사용할 수 있다.
    // 정적 내부 클래스 Engine
    public static class Engine {

        private static int engineCount = 0;
        private int serialNumber;

        public Engine() {
            this.serialNumber = ++engineCount;
        }

        public void start() {
            System.out.println("Engine " + serialNumber + " 동작 합니다");
        }
    } // end of inner static class

}

 

-SpaceshipMain

package innerclass;

public class SpaceshipMain {

    public static void main(String[] args) {

        // 정적 내부클래라서 바로 생성 가능함
        Spaceship.Engine engine1 = new Spaceship.Engine();
        Spaceship spaceship = new Spaceship();
        spaceship.addEngine(engine1);
        spaceship.startSpaceShip();

    } // end of main
}

지역 내부 클래스(Local Inner Class)

지역 내부 클래스는 특정 메서드 내에서만 정의되고 사용되는 클래스.

지역 내부 클래스는 메서드 실행 시에만 존재하고 메서드의 지역 변수처럼 동작.

이 클래스는 외부에서는 접근할 수 없으며, 주로 메서드 내에서 일회성 작업을 수행하는 객체를 생성할 때 유용.

package innerclass;

// 지역 내부 클래스(Local inner class)
public class OuterClass3 {
    public void display() {
        // 메서드 안에 클래스를 선언
        class LocalInnerClass {
            void printMessage() {
                System.out.println("지역 내부 클래스의 메서드");
            }
        } // 지역 내부 클래스

        // 지역 내부 클래스의 인스턴스 생성
        LocalInnerClass innerClass = new LocalInnerClass();
        innerClass.printMessage();
    }
}

 

-Main3

package innerclass;

public class Main3 {

    public static void main(String[] args) {
        OuterClass3 outerClass3 = new OuterClass3();
        outerClass3.display();

    } // end of main
}

익명 내부 클래스(이름 없는 클래스)

package innerclass;

// 익명 내부클래스 사용해 보기
public class OuterClass4 {
    // 1.
    Runnable runnable; // 인터페이스
    // 1.
    public OuterClass4() {
       // 인터페이스를 구현 익명 클래스로 생성시킬 수 있다.
       // 내부에서 추상 메서드를 일반 메서드로 재 정의해서 마치 실제 클래스 처럼 구현해서 사용할 수 있다.
        new Runnable() {
            @Override
            public void run() {
                //...
            }
        };
    } // end of 생성자

    // 2.
    // 멤버 변수 선언과 동시에 인터페이스를 구현 클래스로 동시에 초기화
    Runnable runnable2 = new Runnable() {
        @Override
        public void run() {

        }
    };

}

 

'Java > JAVA 유용한 클래스' 카테고리의 다른 글

자바 I/O 개론  (0) 2026.03.20
멀티 스레딩(multi-threading)  (0) 2026.03.13
Thread  (0) 2026.03.10
Exception(예외처리)  (0) 2026.03.10
String, StringBuffer  (0) 2026.03.10