프로그래밍/Java

Java Generic Erasure

seungdols 2015. 8. 1. 00:06


제네릭 지우개 기능? 뭐지? 뭘까요 ?




C# 코드

Java 코드




두 코드의 차이는 거의 없습니다. 다 모두 제네릭을 인자로 받아 List 타입을 체크 하는 것입니다. 


그런데 C#의 코드는 정상적으로 구별 해냅니다. 그 이유는 코드가 컴파일 되는 시점에서 Intermediate Language코드가 타입에 대한 정보도 같이 저장하고 있습니다. 이 코드가 Common Language Runtime 에서 실행 되는 때에 IL코드를 바이너리로 변환 하는데 바이너리 역시 타입 정보까지 변환합니다. 그렇기 때문에 더 우수한 제네릭 기능입니다.


그렇지만 Java의 경우 컴파일 에러를 발생시킵니다. <?>로 변환하라는 것이죠. 그러나 <?> 이 와일드 카드의 의미는 < ? extends Object> 이므로 Object의 자손들 모두를 의미합니다. 그럼 제네릭을 사용하는 것이 무의미해지죠. 그래서 지우개 기능이라고 합니다. 소스코드에서는 다른 것으로 인식하지만, 바이트 코드 (JVM에서 동작하는 코드) 의 경우에는 List는 타입이 어떻게 지정 되건 List인 것입니다. 그럼 제네릭의 기능이 완전하지 않다고 볼수 있습니다. 즉, 컴파일 사기라고도 하더군요. 

임백준님의 폴리글랏 프로그래밍 책에서도 소개가 되었습니다.



Java vs C# 차이 WIKI 에도 정리가 되어 있습니다. 



위 코드의 결과는 

Apple

Apple List 입니다. 


즉, 컴파일 타임시 Bytecode로 변환되는 순간 Type Info가 사라집니다.





List에 대한 Type 정보가 사라진 걸 볼 수 있습니다.


반응형