glenn-syj / more-effective-java

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

[MEJ-006] 공변과 불공변에 대한 이해 #133

Closed ssh2957 closed 4 months ago

ssh2957 commented 5 months ago

Based on: #126 by @yngbao97 공변과 불공변이라는 단어조차 이번 Item을 통해 처음 알게 되었는데 yngbao97님의 예시코드와 구체적인 설명덕분에 이해하는데 큰도움이 되었습니다. 특히 타입소거에 대한 개념이 이글을 읽기 전까지 잘 와 닿지 않았는데 컴파일 부분과 런타임 부분에서 어떻게 타입소거가 일어나는지에 대한설명 덕분에 각각의 시간에 어떤 변화가 일어나는지 이해할수 있었습니다. 하지만 변화가 일어나는 메커니즘은 이해했는데 왜 자바가 제네릭 타입을 타입소거하는지 이해가 잘 되지 않았습니다.. 혹시 타입소거가 어떤 장점이 있는지 설명해 주실수 있을까요?

yngbao97 commented 5 months ago

제네릭은 제네릭이 지원되기 전의 레거시 코드와 제네릭 타입을 함께 사용할 수 있도록 컴파일 타임에 타입을 체크하고, 런타임시에는 타입을 소거하는 메커니즘을 가지고 있다.

제가 이해한 바로는 제네릭을 JDK 1.5 이후부터 지원했기 때문에 이전 버전으로 작성된 수많은 레거시 소스 코드와의 호환을 위해서 타입소거가 필요하다고 합니다!. 따라서 여전히 로타입으로도 실행이 가능하긴 하지만, 코드의 안정성을 위해 제네릭 사용이 권장되고 있는 것으로 이해했습니다!