(JAVA) 제네릭은 타입변환을 제거한다?

송은석·2021년 1월 27일
0

"이것이 자바다"를 보면

"제네릭은 타입변환을 제거하여 프로그램의 성능을 향상시킨다"는 내용이 나온다.

그러나

https://ict-nroo.tistory.com/42 에서 댓글을 보면, 타입변환을 제거할 수 있다는 말은 잘못된 말이라는 내용이 나온다.
바이트 코드 상에서는 형변환이 일어나기 때문이다.



"타입변환을 제거할 수 있다."

이 부분은 잘못된 정보입니다.

byte code 뜯어보면 Generic은 java.lang.Object로 서술되어있고 Run time시의 형변환 이나 제네릭을 통한 byte code상의 형변환은 정확히 똑같습니다.

opcode - checkcast가 발생합니다

https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms-6.5.checkcast

결론적으로

List list = new ArrayList();
list.add("hello");
String str = (String) list.get(0);

List list = new ArrayList();
list.add("hello");
String str = list.get(0);

직접 참조 자료형을 형변환 하는 것이나 Generic을 사용하는 것이나
동일한 byte code로 작성되며 성능이점 또한 없습니다.

출처: https://ict-nroo.tistory.com/42 [개발자의 기록습관]의 댓글 중



추가적으로

https://cla9.tistory.com/44 를 보면 어떤 식으로 generic의 타입 변환이 일어나는 지 친절하게 알려주고 있다.

  • T 타입에 대한 경계를 지정하지 않으면 가장 최상위인 Object로 컴파일시 변경된다.
  • T 타입에 대한 경계를 지정하면, 해당 타입으로 컴파일시 변경된다.

결론

다양한 타입을 받을 수 있고, 자동으로 타입 변환을 해준다는 이점을 가지지만, 제네릭이 타입 변환을 제거하여 프로그램의 성능을 향상시킨다는 말을 옳지 않다고 볼 수 있겠다.

profile
Done is better than perfect🔥

0개의 댓글