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

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

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개의 댓글