-
[Java/Kotlin] Static nested class 와 Inner Class 중 무엇을 써야할까?프로그래밍 언어/Java 2022. 11. 6. 14:10
불필요한 메모리사용과 메모리 누수를 피하려면 중첩클래스를 사용할 때
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++); } } }
Reference
Avoid memory leaks in inner classes
Beware garbage collection when working with inner classes
www.infoworld.com
non static inner class를 memory 해제를 할 순 없을까?
일단 내가 찾아본 자료들로는 명시적으로 non static inner class의 memory를 해제할 순 없어보인다 무조건 outer class의 instance를 들고있게된다. (hidden으로 들고있게된다고 한다.) 의문이 들었던 것은 non s
fsd-jinss.tistory.com
728x90'프로그래밍 언어 > Java' 카테고리의 다른 글
[Java] multipartFile 이미지 리사이징 예제코드 (0) 2022.11.13 [Java] 클래스 로드와 클래스 초기화 (StaticInnerClass, InnerClass, MemoryLeak) (0) 2022.11.06 [Java] 바이트코드 조작하기 (JavaAgent, JVM, Jacoco) (0) 2022.06.06 [Java] JVM 이 무엇인지, 어떻게 작동하는지 대충 훑어보자! (feat. 클래스로더) (1) 2022.05.29 [Java/OS] 세마포어(Semaphore)에 관하여 (2) 2022.03.18