9.1 중첩 클래스

클래스가 여러 클래스와 관계를 맺는 경우에는 독립적으로 선언하는 것이 좋으나, 특정 클래스만 관계를 맺을 경우에는 중첩 클래스로 선언하는 것이 유지보수에 도움이 됨.

중컵 클래스란 클래스 내부에 선언한 클래스를 말하는데, 중첩 클래스를 사용하면 클래스의 멤버를 쉽게 사용할 수 있고 외부에는 중첨 관계 클래스를 감춤으로써 코드의 복잡성을 줄일 수 있다.

중첩 클래스는 선언하는 위치에 따라 두 가지로 분류 됨. 클래스의 멤버로서 선언되는 중첩 클래스는 멤버 클래스라고 하고, 메소드 내부에서 선언되는 중첩 클래스를 로컬 클래스라 함.

image.png

중첩 클래스도 하나의 클래스이기 때문에 컴파일하면 바이트코드 파일이 별도로 생성됨. 멤버 클래스일 경우 바이트코드 파일의 이름은 다음과 같이 결정 됨.

image.png

로컬 클래스일 경우에는 다음과 같이 $1이 포함된 바이트코드 파일이 생성 됨.

image.png

9.2 인스턴스 멤버 클래스

인스턴스 멤버 클래스는 다음과 같이 A 클래스의 멤버로 선언된 B 클래스를 말함.

image.png

접근 제한자에 따른 인스턴스 멤버 클래스의 접근 범위는 다음과 같음.

image.png

인스턴스 멤버 클래스는 B는 주로 A 클래스 내부에서 사용되므로 private 접근 제한을 갖는 것이 일반적임. B 객체는 A 클래스 내부 어디에서나 생성할 수는 없고, 인스턴스 필드값, 생성자, 인스턴스 메소드에서 생성할 수 있음. A 객체가 있어야 B 객체도 생성할 수 있기 때문.

package ch09.sec02;

public class A {
    //인스턴스 멤버 클래스
    class B {}

    //인스턴스 필드 값으로 B 객체 대입
    B field = new B();

    //생성자
    A() {
        B b = new B();
    }

    //인스턴스 메소드
    void method() {
        B b = new B();
    }
}

B 객체를 A 클래스 외부에 생성하려면 default 또는 public 접근 제한을 가져야 하고, A 객체를 먼저 생성한 다음 B 객체를 생성해야 함.

A a = new A();
A B b = a.new B();
package ch09.sec02;

public class AExample {
    public static void main(String[] args) {
        //A 객체 생성
        A a = new A();

        //B 객체 생성
        A.B b = a.new B();
    }
}

인스턴스 멤버 클래스 B 내부에는 일반 클래스와 같이 필드, 생성자, 메소드 선언이 올 수 있음. 정적 필드와 정적 메소드는 Java 17부터 선언이 가능함.