[Java] 제너릭(Generic): 클래스

제너릭은 클래스나 함수의 정의에서 특정 타입을 일반화하는 훌륭한 기능이다.

제너릭 클래스는 이런식으로 정의할 수 있다.
< > 안에 일반화된 타입명이 들어간다. 이걸 타입 매개변수라 부르는데, 맘대로 지어도 되지만 하나면 보통 T로 쓴다. image

image

이렇게 일반화된 타입들은 사용시에 저 타입을 구체화해야만 사용할 수 있다.
이런식으로 말이다. image

image 이러면 저 T에 Integer와 String을 집어넣은 버전의 클래스가 각각 구체화돼서 사용된다.
이러한 변환은 전부 컴파일타임에 수행되므로, 런타임 오버헤드가 없다.


타입 매개변수 생략
변수의 타입 타입 매개변수가 명시된 상태에서는, 생성식의 타입 매개변수를 생략할 수 있다.
이렇게 image

image 불필요한 표현의 중복을 제거한다.


주의점
자바는 타입 시스템이... 그리 직교적이진 못하다. 예로 제너릭의 타입 매개변수는 무조건 참조타입만 들어갈 수 있다.
그래서 Integer 같은 참조래퍼는 잘 들어갔지만 image

image int 등의 기본 값타입은 사용할 수 없다.

자바라는 언어뿐만 아니라 JVM 수준의 결함이라서, kotlin 등의 패밀리 언어들도 안고가는 문제 중 하나다.