왜냐하면 inner 클래스는 inner static 클래스보다 메모리를 더 먹고, 더 느리고, 외부 클래스가 GC 대상에서 빠져 버려 메모리 관리가 안될 수 있기 때문이다.
일반적으로 내부 인스턴스 클래스를 만들기 위해서는 먼저 외부 클래스를 초기화한뒤 내부 클래스를 초기화해야 한다.
반면 아래 코드처럼 내부 클래스가 외부 참조를 생성함으로, 외부클래스.this
를 통해서 내부에서 외부 클래스를 참조할 수 있다.
public class Outer_Class {
int field = 10;
int getField() {
return field;
}
class Inner_Class {
int inner_field = 20;
int getOuterfield() {
return Outer_Class.this.getField(); // 숨은 외부 참조가 있기 때문에 가능
}
}
}
이 경우에 외부 클래스는 필요가 없어지고 내부 클래스만 남아있을경우, 필요없어진 외부 클래스를 GC 대상으로 삼아 메모리에서 제거해야 하지만,
외부 참조로 내부 클래스와 연결되어 있기 때문에 메모리에서 제거가 안되고 잔존하게 되고 이는 곧 메모리 누수로 프로그램이 터지게 된다.
원래라면 메소드 호출용도로만 쓰여진 일회용 객체는 바로 GC 수거 대상이 되어 제거되어야 되지만, 내부 클래스에서 외부 클래스를 참조하고 있는 관계 때문에, 내부 클래스 데이터가 살아있는 한 외부 클래스 데이터도 계속살아있어 데이터가 지속적으로 메모리에 쌓이게 되어 프로그램이 위험에 빠질 수 있다.
위의 이유들로 내부 클래스를 static
으로 선언해야한다.
static으로 하면 위의 문제들을 어떻게 해결해줄 수 있는가?
static 클래스는 외부 참조를 하지 않는다.
static 클래스는 외부 참조를 하지 않고, 외부 인스턴스 없이 만들어질 수 있으므로 외부 클래스가 GC 수거 대상이 되기에 메모리 관리가 된다.