자바에서는 제네릭 타입은 컴파일 시에만 유효하며, 런타임에는 제네릭 타입의 정보가 소거됩니다. 이러한 과정을 "타입 소거(Type Erasure)"라고 합니다. 타입 소거는 제네릭의 특성 상 타입을 런타임에 알 수 없기 때문에 발생합니다.
타입 소거에 따라 몇 가지 중요한 사항이 있습니다.
1. 제네릭 타입의 실체화 불가능
컴파일 시에 타입 정보가 소거되므로, 런타임에는 제네릭 타입에 대한 정보가 없어집니다. 따라서, 제네릭 타입을 실체화하여 객체를 생성하는 것은 불가능합니다.
2. 경고 및 형변환
컴파일러는 타입 소거로 인해 제네릭 코드에서 발생하는 경고를 경고합니다. 또한, 컴파일러는 필요한 경우 형변환 코드를 삽입하여 타입 안전성을 유지합니다.
3. 와일드 카드와 상속
제네릭 클래스에서 와일드 카드나 제네릭 타입의 상속 관계에 따라 컴파일러는 형변환을 적절하게 처리합니다.
간단한 예시로 제네릭 타입이 타입 소거되는 경우를 살펴보겠습니다.
import java.util.*;
public class GenericExample<T> {
private T data;
public GenericExample(T data) {
this.data = data;
}
public T getData() {
return data;
}
public static void main(String[] args) {
GenericExample<String> stringExample = new GenericExample<>("Hello");
// 컴파일 시에는 GenericExample<String>이지만, 런타임에는 GenericExample이 됨
GenericExample rawExample = stringExample;
// 경고: unchecked call to getData() as a member of the raw type GenericExample
String result = (String) rawExample.getData();
System.out.println(result);
}
}
위의 코드에서 rawExample은 GenericExample이 되며, 런타임에는 T의 타입 정보가 소거되므로 실제로는 Object 타입으로 다뤄집니다. 따라서 getData()를 호출할 때 명시적인 형변환을 해주어야 합니다.
타입 소거는 자바의 제네릭이 런타임에도 타입 안전성을 유지하면서 이전 버전과 호환되도록 하는 중요한 메커니즘입니다. 하지만 이는 동시에 일부 제네릭 타입의 정보가 손실되는 단점을 가지고 있습니다.
With ChatGPT
'JAVA > 포스팅' 카테고리의 다른 글
자바 열거형의 정의와 사용 (0) | 2023.11.20 |
---|---|
자바 열거형 (0) | 2023.11.19 |
자바 제네릭 타입의 형변환 (0) | 2023.11.19 |
자바 제네릭 메서드 (0) | 2023.11.19 |
자바 제네릭스 와일드 카드 (0) | 2023.11.19 |