[JAVA]Type Erasure는 어떻게 동작할까?

무지성개발자·2023년 8월 17일
0

Type Erasure

Type Erasure는 제네릭을 컴파일 하는 방법이다.

제네릭은 특정한 데이터 타입을 미리 지정하지 않고, 타입 매개변수를 사용하여 코드의 재사용성과 타입 안정성을 높이기 위한 기능이다. 이런 제네릭을 컴파일 할 때 Type Erasure 프로세스를 거치며 런타임에는 타입 정보를 알 수가 없다.

Type Erasure를 거친 제네릭 타입은 Object가 되어 실제 타입이 무엇인지 모르게 된다.

Reify와 Non-reify

  • Reify : 타입정보를 런타임에 실제로 존재하는 객체로 만드는 것. 타입 정보가 런타임까지 유지되면 해당 타입의 세부 정보나 속성을 확인하거나 조작할 수 있다.

  • Non-reify : 타입정보가 런타임에서 사라지게 만드는 것. 컴파일 시간에만 타입 정보가 사용되며, 런타임에는 Type Erasure로 해당 타입의 정보가 지워짐.


제네릭 Type erasure 동작과정

  • unbounded Type(<?>, )는 Object로 변환.
public class Test<T> {
    public void test(T test) { // T가 Object로 변환
        System.out.println(test.toString());
    }
}

  • bound type()은 Object가 아닌 Comprarable로 변환.
public class Test<E extends Comparable> {
    public void test(E test) { // E가 Comprarable로 변환
        System.out.println(test.toString());
    }
}

  • 확장된 제네릭 타입에서 다형성을 보존하기 위해 bridge method를 생성.
public class Test implements Comparable<Integer> {
    @Override
    public int compareTo(Integer o) {
        return 0;
    }
	// Object로 된 bridge Method를 만들어냄
	public int compareTo(Object o) {
         return compareTo((Integer)o);
    }
}

Comparable<Integer>가 Object타입으로 Type Eresure 되면서 Object타입으로 bridge methode를 만들어서 타입을 맞춤.

위 이미지들은 intellij 기준 show bytecode를 보면 나온다.


한 줄평 : 컴파일 타임에 일어나는 최적화 기법들은 어려운게 너무 많다..

참고 -
https://devlog-wjdrbs96.tistory.com/263

profile
no-intelli 개발자 입니다. 그래도 intellij는 씁니다.

0개의 댓글