영호

[JAVA] generic에는 왜 primitive type을 쓸 수 없나? 본문

Language/JAVA

[JAVA] generic에는 왜 primitive type을 쓸 수 없나?

0h0 2023. 4. 2. 22:31

개요

generic에서 왜 기본타입을 사용할 수 없는지 궁금해서 찾아본 내용입니다:)

generic등장 이전

generic이 존재하지 않을 땐 아래 코드처럼 List를 사용할 수 있었습니다.

List integerList = new ArrayList();
integerList.add(new Integer(1));
Integer integer = (Integer) integerList.get(0);

해당 List는 Object타입을 원소를 받을 수 있습니다. 즉, 기본 타입을 제외한 모든 참조타입을 원소로 넣을 수 있습니다.

이러한 방식의 문제점은 코드에서 바로 살펴볼 수 있습니다.

  1. get으로 원소에 접근할 때 명시적인 형변환 작업이 필요하다.
  2. 만약 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;
    }
}
Comments