불필요한 메모리사용과 메모리 누수를 피하려면 중첩클래스를 사용할 때 Static Nested Class 를 사용하는 것이 좋다.
Static Nested Class
중첩 클래스 중, static 키워드를 붙인 내부클래스를 지칭한다. (Java) 중첩 클래스 중, 키워드 없는 내부클래스를 지칭한다. (Kotlin)
Inner Class
중첩 클래스 중, 키워드 없는 내부클래스를 지칭한다 (Java) 중첩 클래스 중, inner 키워드를 붙인 내부클래스를 지칭한다. (Kotlin)
인스턴스 생성 시
// JAVA
class A {
class B{}
static class C{}
}
위의 예제 코드를 바탕으로 Static Nested Class 는 인스턴스를 생성하면 C 클래스만 생성된다. 반면에, Inner Class 는 인스턴스를 생성하면 A, B 클래스가 둘다 생성된다.
Memory Leak
Garbage collector 는 내부 인스턴스인 B 클래스가 Garbage collected 되기 전까지 외부 인스턴스 A 클래스를 수거 할 수 없다.
따라서 모든 중첩클래스를 Inner Class 로 습관적으로 작성한다면, Garbage collector 가 수거 할 수 없는 외부 인스턴스가 기하급수적으로 늘어날 것이고 그로 인해 메모리 누수가 심각하게 발생하게 될 것이다.
외부 인스턴스의 메모리 사용량이 많을 수록 영향력은 더 클 것이다. 아래는 외부인스턴스의 메모리 사용량이 큰 예시 중 하나이다.
// Java
class EnclosingClass
{
private int[] data;
public EnclosingClass(int size)
{
data = new int[size];
}
class EnclosedClass
{
}
EnclosedClass getEnclosedClassObject()
{
return new EnclosedClass();
}
}
public class MemoryLeak
{
public static void main(String[] args)
{
ArrayList al = new ArrayList<>();
int counter = 0;
while (true)
{
al.add(new EnclosingClass(100000).getEnclosedClassObject());
System.out.println(counter++);
}
}
}