개요
class MyClass {
class InnerClass{}
static class InnerStaticClass{} // 내부 클래스에 static이 붙는다면?
}
- 내부 클래스에 static 키워드가 붙으면 메모리에 하나만 올라가는 인스턴스일까? 정답은 NO
inner class
// 서로 다른 참조
MyClass.InnerClass mic1 = new MyClass().new InnerClass();
MyClass.InnerClass mic2 = new MyClass().new InnerClass();
- 내부 클래스라고 하더라도 결국 클래스이기 때문에 다른 인스턴스를 생성한다.
inner static class
// 서로 다른 참조
MyClass.InnerStaticClass misc1 = new MyClass.InnerStaticClass();
MyClass.InnerStaticClass misc2 = new MyClass.InnerStaticClass();
- inner static class로 객체를 생성하였지만 다른 참조 가진다.
- static member class의 데이터에 접근하기 위해서는 외부 클래스의 인스턴스를 통해 접근해야 하기 때문에 결국 다른 참조 가진다.
숨은 외부 참조
MyClass mc = new MyClass();
MyClass.InnerClass mic3 = mc.new InnerClass(); // Myclass에 대한 숨은 외부 참조를 가진다.
MyClass.InnerStaticClass misc3 = new MyClass.InnerStaticClass(); // 외부 참조 없음
- InnerClass는 MyClass의 인스턴스가 존재해야지 만들어 질 수 있다.
- 결국 InnerClass는 자신을 만들어준 인스턴스에 대한 외부 참조를 가지게 된다.
- 그리고 이 참조는 숨겨져 있어서 숨은 외부 참조라고 불린다.
- 반면 InnerStaticClass는 외부 인스턴스 없이도 만들어 질 수 있기 때문에 외부 참조가 존재X
class MyClass {
void myMethod() {
...
}
class InnerClass{
void innerClassMethod() {
MyClass.this.myMethod(); // 숨은 외부 참조가 있기 때문에 가능
}
}
static class InnerStaticClass{
void innerClassMethod() {
MyClass.this.myMethod(); // 컴파일 에러
}
}
}
- 외부 참조가 존재하기 때문에 내부 클래스는 외부 클래스에게 접근할 수 있다.