중첩 클래스의 종류를 다시 한번 상기해 보도록 하겠습니다. 잘 기억이 나지 않는다면, 이전에 설명했던 내용을 다시 한번 살펴보도록 하세요. [멤버 클래스]와 [로컬 클래스]로 대분류가 있고, 멤버 클래스는 [인스턴스 멤버 클래스]와 [정적 멤버 클래스]로 구분된다고 했습니다. 참고로 멤버 클래스는 '메서드 내부에 선언되는' 로컬 클래스와 구분되죠?
일단 멤버 클래스(인스턴스/정적 멤버 클래스)들의 객체 생성을 중심으로 살펴보겠습니다. 예를 들어 클래스 A 내부에 중첩 클래스로서 인스턴스 멤버 클래스인 B와 정적 멤버 클래스인 C가 있다고 가정해 보겠습니다. 그리고 클래스 A 내부에서 이 멤버 클래스들의 객체를 생성해서 사용하는 상황이라고 보면, 사용에 어떤 제한이 있을까요?
· 인스턴스 멤버 클래스 B
- 바깥 클래스 A의 인스턴스 필드에서 초기 값으로 객체 생성 가능
- 바깥 클래스 A의 인스턴스 메서드에서 객체 생성 가능
- 바깥 클래스 A의 정적(static) 필드나 정적 메서드에서 객체 생성 불가
※ 클래스 A의 인스턴스 멤버 클래스로서(즉 static 없이) 선언된 경우에는, 반드시 클래스 A의 인스턴스 생성 후 사용 가능하므로
· 정적 멤버 클래스 C
- 바깥 클래스 A의 인스턴스 필드에서 초기 값으로 객체 생성 가능
- 바깥 클래스 A의 인스턴스 메서드에서 객체 생성 가능
- 바깥 클래스 A의 정적(static) 필드나 정적 메서드에서 객체 생성 가능
※ 클래스 A의 정적 멤버 클래스(static)으로 선언된 경우에는, 반드시 클래스 A에서 자유롭게 선언 가능함
바깥 클래스인 A 안에서 선언된 멤버 클래스 B, C에 대한 내용을 살펴보도록 하겠습니다.
public class A {
/* 인스턴스 멤버 클래스 */
class B {}
/* 정적 멤버 클래스 */
static class C {}
/* 클래스 A의 인스턴스 필드 */
B field1 = new B();
C field2 = new C();
/* 클래스 A의 인스턴스 메서드 */
void method1() {
B var1 = new B();
C var2 = new C();
}
/* 클래스 A의 정적 필드 초기화 */
// static B field3 = new B(); 사용 불가
static C field4 = new C();
/* 클래스 A의 정적 메서드 */
static void method2() {
// B var1 = new B(); 사용 불가
C var2 = new C();
}
}
'Programming > JAVA' 카테고리의 다른 글
중첩 클래스&인터페이스(3) - 중첩 클래스의 접근 제한자 3 : 로컬 클래스 (0) | 2023.04.09 |
---|---|
중첩 클래스&인터페이스(3) - 중첩 클래스의 접근 제한자 2 (0) | 2023.04.06 |
중첩 클래스&인터페이스(2) - 중첩 클래스의 종류 2 : 정적 멤버 / 로컬 클래스 (0) | 2023.04.03 |
중첩 클래스&인터페이스(2) - 중첩 클래스의 종류 1 : 인스턴스 멤버 클래스 (0) | 2023.04.02 |
중첩 클래스&인터페이스(1) (0) | 2023.03.31 |