반응형
제네릭
제네릭은 타입 세이프를 보장해주는 컴파일 타임 메커니즘, 리플렉션은 런타임 메커니즘이다.
즉, 코드짤땐 type T가 뭔진 모르겠지만 타입 세이프는 보장해주었으면 좋겠어~라고 하면 컴파일러는 type T를 Object로 변환해주어 런타임에 어떤 객체가 와도 동작하게 해준다.
이러한 컴파일 타임엔 타입 세이프를 검사하지만 런타임엔 타입을 제거하는 과정을 거치게 되는데, 이걸 자바에선 type erasure라고 부른다.
Type Erasure 동작 과정
- generic type들을 모두 Object로 바꾼다.
- 타입 캐스팅이 필요한 경우 타입을 주입하기도 한다.
- 다형성을 위해 bridge method들을 생성한다.
리플렉션
이와는 달리 리플렉션은 객체의 클래스들과 인터페이스를 나타내는 Class 인스턴스를 생성한다.
Class는 생성자가 없고, JVM에 의해 클래스로 로딩되며 classLoader의 defineClass 메소드를 호출하여 생성된다.
리플렉션은 이렇게 동적으로 생성되기 때문에 JIT Compiler의 최적화를 수행할 수 없어 퍼포먼스 오버헤드가 커지게 되는 것이다. ( 이 외에도 해당 class를 동적으로 탐색해야 하는 문제 등 퍼포먼스에 영향을 주는 로직들이 많다. )
참조
https://docs.oracle.com/javase/tutorial/java/generics/erasure.html
https://devlog-wjdrbs96.tistory.com/263
http://stas-blogspot.blogspot.com/2010/03/java-bridge-methods-explained.html
https://cla9.tistory.com/51
https://stackoverflow.com/questions/5756081/java-generics-reflection
https://stackoverflow.com/questions/27606449/how-exactly-do-generics-work
반응형
'Java' 카테고리의 다른 글
[JAVA] JMH(Java Microbenchmark Harness)를 사용하여 성능 테스트를 해보자 (0) | 2022.04.24 |
---|---|
[JAVA] M1 jdk, jenv 환경 세팅 (0) | 2022.02.19 |