영호
[JAVA] generic에는 왜 primitive type을 쓸 수 없나? 본문
개요
generic에서 왜 기본타입을 사용할 수 없는지 궁금해서 찾아본 내용입니다:)
generic등장 이전
generic이 존재하지 않을 땐 아래 코드처럼 List를 사용할 수 있었습니다.
List integerList = new ArrayList();
integerList.add(new Integer(1));
Integer integer = (Integer) integerList.get(0);
해당 List는 Object타입을 원소를 받을 수 있습니다. 즉, 기본 타입을 제외한 모든 참조타입을 원소로 넣을 수 있습니다.
이러한 방식의 문제점은 코드에서 바로 살펴볼 수 있습니다.
- get으로 원소에 접근할 때 명시적인 형변환 작업이 필요하다.
- 만약 String타입 원소를 넣었는데 Interger로 변환하는 실수를 컴파일 시점에 알 수 없다.
generic등장
이러한 문제점을 해결하는 generic이 JAVA5에 추가됐습니다. generic이 타입 안정성을 보장하고, 형변환의 번거로움을 해소시켜 줬습니다.
왜 primitive type은 사용할 수 없나?
타입 소거 방식을 사용한다.
제네릭은 컴파일러에 의해 타입소거 과정을 거치게 됩니다. 이로 인해 기존 generic type은 모두 Object로 대치됩니다. 이로 인해 generic타입 파라미터에는 Object로 형변환 될 수 있는 참조 타입만 올 수 있습니다.
public class Example<T> {
private T data;
public T getData() {
return data;
}
}
위 코드가 컴파일러의 타입 소거 과정을 거치면 아래와 같이 변환됩니다.
public class Example {
private Object value;
public Object getValue() {
return value;
}
}
generic type에 extends를 사용한 경우는 Object가 아닌 extends에 명시된 타입으로 대치됩니다.
public class Example<T extends Number> {
private T data;
public T getData() {
return data;
}
}
public class Example {
private Number value;
public Number getValue() {
return value;
}
}
'Language > JAVA' 카테고리의 다른 글
[JAVA] Jackson사용 시 primitive boolean주의점 (1) | 2023.07.23 |
---|---|
[JAVA] Collections.emptyList() vs List.of() (4) | 2023.03.18 |
eqauls, hashCode(feat. 동일성과 동등성) (0) | 2023.03.04 |
[JAVA] HashMap을 이용해 Enum인스턴스 조회하기 (0) | 2022.12.13 |
[JAVA] Array를 stream으로 (Arrays.stream() vs Stream.of()) (0) | 2022.10.28 |
Comments