Inner Class에대해 알아보다 메모리 누수 관련한 이슈가 있어 공부해 보았습니다.
Inner Class를 사용하지는 않았지만, Login이나 외부클래스에서만 사용해야하는 것들은 잘 사용할 수 있을것 같아 제대로 알고 사용해 보겠습니다.
InnerClass는 OuterClass를 외부참조 합니다.
InnerClass는 OuterClass가 생성되고 나서 생성이 됩니다.
그리고 OuterClass를 참조하게 됩니다.
이렇게 되면 어떤 문제가 발생할까요?
OuterClass를 사용해서 외부접근이 가능하다는 단점이 있습니다.
InnerClass를 사용하는 이유는 OuterClass 안에서만 사용하려고 하는것인데 다른 클래스에서 접근이 가능하기 때문입니다.
InnerClass의 외부참조로 인해 GC의 대상이 되지 않습니다.
OuterClass가 사용되지 않아 GC의 대상이 되어야 하는데 InnerClass가 참조하고있어 GC의 대상이 되지 않습니다.
이런 상황이 지속적으로 발생한다면 Heap영역을 전부 사용하여 메모리가 부족해지게 될 것입니다.
우선 OuterClass가 참조되고있는 상황입니다.
위 그림에서는 OuterClass가 참조중이기 때문에 전혀 문제가 없습니다.
하지만 OuterClass가 참조중이지 않는다면 심각한 상황이 발생합니다.
위 그림처럼 Stack영역에서 참조하는 변수가 없는데도 InnerClass때문에 GC가 관리하지 않게 됩니다.
해결 방법 - Static InnerClass
InnerClass를 사용할때는 Static InnerClass를 사용하여 이 문제를 해결할 수 있습니다.
장점
- static InnerClass는 외부참조를 하지 않습니다.
- InnerClass가 OuterClass를 외부참조 하지 않기 때문에 OuterClass는 GC의 대상이 되어 메모리 누수가 발생하지 않습니다.
따라서 내부 클래스가 외부 클래스의 멤버를 가져와 사용하는 경우가 아닌 경우
반드시 내부 클래스를 선언 할 때는 static 키워드를 붙여주어야 합니다!
참고
☕ 내부 클래스는 static 으로 선언 안하면 큰일 난다
Inner 클래스의 문제점 인텔리제이와 같은 IDE에서 내부 클래스를 선언하여 사용하면 다음과 같이 경고 메세지가 뜰 것이다. (내부 클래스가 외부의 멤버를 참조하여 사용하지 않을 경우) 메세지
inpa.tistory.com
'Java' 카테고리의 다른 글
equals 사용시 주의할점 (0) | 2024.01.05 |
---|---|
Lambda, Stream (0) | 2023.10.11 |
Error와 Exception의 차이 (0) | 2023.10.10 |
ThreadPool (1) | 2023.10.08 |
자바 컬렉션 (0) | 2023.09.27 |