일상기록
Java - 제네릭 타입의 제거 본문
제네릭 타입의 제거
컴파일러는 제네릭 타입을 이용해서 소스파일을 체크하고, 필요한 곳에 형변환을 넣어준다. 그후 제네릭 타입을 제거한다. 즉, 컴파일된 파일(*.class)에는 제네릭 타입에 대한 정보가 없다. 이렇게 하는 주된 이유는 제네릭이 도입되기 이전의 소스 코드와의 호환성을 유지하기 위해서이다. JDK1.5부터 제네릭이 도입되었지만, 아직도 원시 타입을 사용해서 코드를 작성하는 것을 허용한다. 하지만 앞으로 가능하면 원시 타입을 사용하지 않도록 하자. 언젠가는 분명히 새로운 기능을 위해 하위 호환성을 포기하게 될 때가 올 것이다.
제네릭 타입의 제거 과정은 꽤 복잡하기 때문에 자세히 설명하기는 어렵다 기본적인 제거과정에 대해 알아보자.
1. 제네릭 타입의 경계(bound)를 제거한다.
제네릭 타입이 <T extends Fruit>라면 T는 Fruit로 치환된다. <T>인 경우는 T는 Object로 치환된다. 그리고 클래스 옆의 선언은 제거된다.
class Box<T extends Fruit> {
void add(T t){
...
}
}
// 컴파일 후
class Box {
void add (Fruit t){
...
}
}
2. 제네릭 타입을 제거한 후에 타입이 일치하지 않으면, 형변환을 추가한다.
List의 get()은 Object타입을 반환하므로 형변환이 필요하다.
T get(int i) {
return list.get(i); // 형변환이 생략 원래는 필요하다.
}
Fruit get(int i) {
return (Fruit)list.get(i);
}
와일드 카드가 포함되어 있는 경우에는 다음과 같이 적절한 타입으로 형변환이 추가된다.
static Juice makeJuice(FruitBox<? extends Fruit> box) {
String tmp = "";
for(Fruit f : box.getList()){
tmp += f + " ";
}
return new Juice(tmp);
}
static Juice makeJuice(FruitBox<? extends Fruit> box) {
String tmp = "";
Iterator it = box.getList().iterator();
while(it.hasNext()){
tmp += (Fruit)it.next() + " ";
}
return new Juice(tmp);
}
'Java' 카테고리의 다른 글
Java - 람다식(Lambda expression) (1) | 2023.04.18 |
---|---|
Java - 열거형(Enums) (0) | 2023.04.18 |
Java - 제네릭 타입의 형변환 (0) | 2023.04.18 |
Java - 제네릭 메소드 (0) | 2023.04.18 |
Java - 와일드 카드 (0) | 2023.04.17 |