이전 면접에서 type erasure에 대해 질문을 받았었는데 처음 듣는 개념이라 아무 말도 못 했기 때문에 오늘은 type erasure를 공부해 봤다.
type erasure에 대해 알아보기 전에 제네릭의 개념을 알아야 하는데 간단하게 제네릭을 정의하면 클래스나 메서드를 선언할 때 <String>이나 <Integer> 같은 타입을 지정할 수 있는데, 이를 통해서 다양한 타입의 객체와 함께 쓰이면서, 유연하고 재사용 가능한 코드를 작성할 수 있다. 제네릭에 대해서는 이전에 정리한 글이 있어 참고하면 좋을 것 같다.
https://seungjjun.tistory.com/251
Type erasure
타입 소거(type erasure)란 컴파일 시 코드에서 제네릭 타입의 정보를 제거하고 Object 같은 기본 타입으로 대체하는 과정을 말한다.
좀 더 간단히 말하면 제네릭 타입의 정보(<String>이나 <Integer> 같은)는 런타임 시점에 소거되어 사용할 수 없게 된다.
그럼 type erasure의 목적은 무엇일까?
타입 소거는 제네릭을 사용하지 않는 기존 코드와의 하위 호환성을 지원하는데 사용이 된다. 다시 말해 제네릭이 지원되지 않는 이전 버전에서 작성된 자바 코드와 상호 작용할 수 있게 도와주는 역할을 한다.
예시 코드를 보자
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("hello");
String word = arrayList.get(0);
위 예시 코드는 컴파일 시점에 ArrayList의 String은 지워지고 Object 타입으로 대체가 된다.
ArrayList arrayList = new ArrayList<>();
arrayList.add("hello");
String word = (String) arrayList.get(0);
Type erasure의 한계점
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("Hello");
if(arrayList instanceof List<String>) {
}
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("Hello");
if(arrayList instanceof List<?>) {
// ...
}
정리
type erasure에 대해 정리하면 타입 소거(type erasure)는 제네릭 코드가 제네릭을 지원하지 않는 기존 코드와 하위 호환이 되도록 하는 기능이다.
'Java' 카테고리의 다른 글
[Java] 불변 클래스로 변경 가능성을 최소화하자 (0) | 2023.07.02 |
---|---|
[Java] 추상 클래스와 인터페이스 (0) | 2023.03.19 |
[Java] 리플렉션(Reflection)공부하기 (0) | 2023.03.01 |
[Java] 제네릭(Generic)이란? (1) | 2023.02.28 |
[Java] Checked Exception과 Unchecked Exception (2) | 2023.02.27 |