본문 바로가기

Programming/JAVA

중첩 클래스&인터페이스(2) - 중첩 클래스의 종류 1 : 인스턴스 멤버 클래스

java logo image

 

 

 

중첩 클래스는 '클래스 내부에' 선언되는 클래스입니다. 이때, 이 중첩 클래스는 내부에 선언되는 위치에 따라서 종류가 분류됩니다. 종류는 크게 다음 두 가지가 있습니다. 

 

· 멤버 클래스 

· 로컬 클래스

 

분류 선언 위치 특성
멤버 클래스 인스턴스 멤버 클래스 class A {
    class B { ... }
}
- 클래스 A 객체가 생성되어야만 사용할 수 있는 중첩 B 클래스
  : 그래서 클래스 B에는 static 멤버 / 메서드 선언 불가
정적 멤버 클래스 class A {
    static class B { ... }
}
- 클래스 A를 통해 바로 접근할 수 있는 중첩 B 클래스
로컬 클래스 class A {
    void method( ) {
        class B { ... }
    }
}
- method( )가 실행 중일 때만 사용 가능한 중첩 B 클래스

 

 

위에서 설명한 중첩 클래스들 역시, 엄연한 하나의 클래스이기 때문에 컴파일을 진행할 경우 별도의 바이트 코드 파일(.class)이 산출되는 것도 동일합니다. 다만 파일 이름은 종속되는 클래스와 다음과 같이 함께 표시하게 됩니다. 

 

// 멤버 클래스. $이 포함된다.
A $ B .class

// 로컬 클래스. $1이 포함된다.
A $1 B .class

 

 

그러면 이제부터는 멤버 클래스 / 로컬 클래스의 각각의 특성과 선언 방식, 사용에 대해서 살펴보도록 하겠습니다. 

 

 

 


 

 

○ 인스턴스 멤버 클래스

 

인스턴스 멤버 클래스의 위의 표에서 말한 것 같이 멤버 클래스 중, static 키워드가 없는 중첩 클래스를 의미합니다. 정의에서 알 수 있듯이, 클래스의 인스턴스 객체가 생성되어야만 사용이 가능한 클래스이기 때문에 static 필드와 메서드는 선언할 수 없는 것이 특이사항 입니다.

 

class A {
    / * 인스턴스 멤버 (중첩)클래스 */
    class B {
        B() { }           // 생성자
        int field1;       // 인스턴스 필드
        void method1();   // 인스턴스 메서드
    }
}

 

실행 클래스나 기타 A 클래스 외부의 클래스에서 (인스턴스 멤버 중첩)클래스 B의 객체를 생성하기 위해서는, 반드시 A의 객체 인스턴스를 먼저 생성해야 합니다. 이 중첩 클래스 B의 경우 기본적인 데이터 타입을 선언할 때는 A.B의 형태로 사용한다는 점 또한 헷갈리기 쉬운 부분이니 주의합시다.

 

정리하자면, 클래스 A 타입의 인스턴스를 생성하고 나서 B타입 인스턴스를 선언할 때 A.B 타입의 변수를 선언해야 하며 new 키워드를 사용하는 경우에는 A타입의 인스턴스 변수(a라고 가정)에 종속되는 B 타입이라고 선언해야 합니다. 조금 복잡하죠? 아래의 예제를 보며 익숙해지도록 합시다. 위에서 선언 예제에서 사용한 클래스 A와 중첩 클래스 B를 사용한다고 가정하겠습니다.

 

// A 클래스 인스턴스의 생성
A a = new A();
// 인스턴스 멤버 중첩 클래스 B의 인스턴스 생성
A.B b = a.new B();

b.field1 = 3;
b.method1();

 

A.B 타입을 사용한다는 점과, new 키워드 사용 시점에 A의 클래스 인스턴스 변수 a를 붙여주는 점이 생경합니다. 주의하시기 바랍니다.