중첩 클래스는 '클래스 내부에' 선언되는 클래스입니다. 이때, 이 중첩 클래스는 내부에 선언되는 위치에 따라서 종류가 분류됩니다. 종류는 크게 다음 두 가지가 있습니다.
· 멤버 클래스
· 로컬 클래스
분류 | 선언 위치 | 특성 | |
멤버 클래스 | 인스턴스 멤버 클래스 | 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를 붙여주는 점이 생경합니다. 주의하시기 바랍니다.
'Programming > JAVA' 카테고리의 다른 글
중첩 클래스&인터페이스(3) - 중첩 클래스의 접근 제한자 1 (0) | 2023.04.04 |
---|---|
중첩 클래스&인터페이스(2) - 중첩 클래스의 종류 2 : 정적 멤버 / 로컬 클래스 (0) | 2023.04.03 |
중첩 클래스&인터페이스(1) (0) | 2023.03.31 |
인터페이스(13) - 디폴트 메서드가 있는 인터페이스의 상속 (0) | 2023.03.30 |
인터페이스(12) - 디폴트 메서드와 인터페이스의 확장 (0) | 2023.03.29 |