본문 바로가기
Java

왜 Generic에 Primitive Type은 사용하지 못할까?

by Taler 2022. 10. 25.

자바에서 Generic을 사용하다보면 알겠지만, Generic에는 오직 객체만 사용할 수 있다. 다시 말해, int, long, boolean 등의 primitive type들은 generic에 사용할 수 없다. 그 이유가 무엇일까?

 

Generic은 초기 자바에는 포함되지 않았고, Java5부터 추가됐다. 처음부터 존재했던 기능이 아니기 때문에, Generic이 없었을 때의 Java 버전과 호환성을 갖춰야 했다. 이로 인해 Generic의 구현은 Type 삭제를 통해 이루어졌다.

 

즉, 모든 generic 타입은 컴파일타임에 object로 변환되고, Generic을 포함하는 클래스는 올바른 타입을 갖는 객체로써 변환된다. 예를 들자면

public class Container<T> {

    private T data;

    public T getData() {
        return data;
    }
}

public class Container {

    private Object data;

    public Object getData() {
        return data;
    }
}

로 변환되는 것이다.

 

즉, Generic 자체가 컴파일타임에 객체로 변환되는 것이기 때문에, 객체만 사용할 수 있는 것이다. 참고로 primitive type은 객체가 아니라 하나의 이다. 이 때문에 primitive type을 generic에 사용하고 싶다면, 객체로 변환할 수 있는 Wrapper type으로 사용해줘야 하는 것이다.

 

// Bad
List<int> list = new ArrayList<>();

// Good
List<Integer> list = new ArrayList<>();

 

이상 제네릭에서 값타입을 사용할 수 없는 이유였다.

댓글