JAVA

멤버 내부 클래스와 정적 내부 클래스

jiyoon12 2025. 4. 27. 22:12
  • 멤버 내부 클래스(Member Inner Class): 외부 클래스의 필드와 같은 위치에 선언되며, 외부 클래스의 인스턴스에 종속적이다.
  • 멤버 내부 클래스의 인스턴스는 외부 클래스의 인스턴스가 있어야 생성할 수 있다.
package inner;

public class OuterClass {

    private int num = 10;

    //inner 클래스란 클래스 안의 클래스를 말한다.
    // 멤버 내부 클래스
    class InnerClass {

        public void display() {
            System.out.println("inner class display() 호출 " + num);
        }
    } // end of inner class

    //메인 함수
    public static void main(String[] args) {
        // InnerClass innerClass = new InnerClass();
        OuterClass outerClass = new OuterClass();
        OuterClass.InnerClass innerClass = outerClass.new InnerClass();
        innerClass.display();
    }
} // end of outer class

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

/**
 * 정적 내 클래스(static inner class)
 */
public class Spaceship {

    private Engine innerEngine;

    // 우주선에 엔진 추가
    public void addEngine(Engine engine) {
        innerEngine = engine;
    }

    public void startSpaceship() {
        if (innerEngine == null) {
            System.out.println("엔진을 먼저 장착해주세요");
        } else {
            System.out.println("달나라로 출발 합니다 슈웅~~");
        }
    }

    //정적 내부 클래스
    public static class Engine {

        public static int ENGINE_COUNT = 0;
        private int serialNumber;

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

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

public class SpaceshipMainTest {

    public static void main(String[] args) {
        // 멤버 내부 클래스 --> 외부 클래스가 먼저 생성이 되어야 접근 가능

        // 정적 내부 클래스 사용
        Spaceship s1 = new Spaceship();
        s1.startSpaceship();

        Spaceship.Engine 누리호1번엔진 = new Spaceship.Engine();
        Spaceship.Engine 누리호2번엔진 = new Spaceship.Engine();
        Spaceship.Engine 누리호3번엔진 = new Spaceship.Engine();

        s1.addEngine(누리호1번엔진);
        s1.startSpaceship();

        // 사용하는 이유
        // [논리적인 그룹화]
        // 정적 내부 클래스는 외부 클래스와 논리적으로 관련 있는 클래스들을
        // 그룹화하는데 유용하다. 이는 코드의 가독성과 구조화 개선이며 관련 클레스들을
        // 함께 유지할 수 있게 도움을 준다.

    } // end of main
}