glenn-syj / more-effective-java

이펙티브 자바를 읽으며 자바를 더 효율적으로 공부합니다
4 stars 5 forks source link

[MEJ-006] 제네릭 타입 소거의 문제점에 대한 질문 #134

Closed FickleBoBo closed 3 months ago

FickleBoBo commented 4 months ago

Based on : @yngbao97 by #126

배열과 리스트에 대해서 공변, 불공변, 실체화, 소거 등의 용어와 함께 설명해주셔서 어려운 주제였지만 흥미롭게 읽을 수 있었습니다. 올려주신 글과 #129 를 읽어보며 단순히 타입 지정을 하는 역할만 하는 줄 알았던 제네릭이 상당히 어려운 개념이라는 생각이 들었습니다.

결론으로 올려주신 타입 소거의 문제점의 경우 제네릭은 앞뒤 동일한 타입을 넣어야 해서(다형성X) 컴파일 단계에서 에러가 발생하지 않으면 런타임 단계에서도 에러가 발생하지 않을 것으로 생각했습니다. 배열의 경우 공변과 다형성때문에 컴파일 단계에서는 에러가 발생하지 않아도 런타임 단계에서 에러가 발생할 수 있다고 생각했습니다. @yngbao97 님의 의문점이 이와 비슷한 맥락인지 궁금합니다.

https://www.tcpschool.com/java/java_generic_concept https://docs.oracle.com/javase/tutorial/java/generics/erasure.html

yngbao97 commented 4 months ago

질문 감사합니다! 저도 글을 작성할 당시에는 '런타임에 제네릭이 전부 사라지면 그로 인해서 다른 타입 간에 섞이게 되는 예외가 없을까?' 라는 막연한 의문으로 남긴 부분이었는데 다시 한번 생각해볼 수 있었어요!

찾아보니 제네릭의 타입 소거로 인해서 '힙 오염'이라는 문제점이 발생할 수 있다고 합니다. 객체가 메모리에 저장될 때 힙 영역에 저장되는데, 배열이나 리스트의 경우 특정한 타입만 저장되도록 지정된 공간이 힙 영역 내부에 할당이 된다고 해요. 그런데 제네릭 타입 소거 때문에 특정한 타입만 저장되도록 지정된 공간에 일치하지 않는 타입의 데이터들이 저장될 가능성이 있는데 이러한 경우 '힙'이 오염되었다고 말합니다.

창용님이 이 글에 힙 오염 관련해서 부가설명을 추가해주셨는데 함께 읽어보시면 좋을 것 같습니다! #137