지네릭스는 다양한 타입의 객체들을 다루는 메소드나 컬렉션 클래스에 컴파일 시 타입체크를 해주는 기능이다.
객체의 타입안정성을 높이고 형변환의 번거로움이 줄어든다.
의도치 않은 타입의 객체가 저장되는 것을 막고, 저장된 객체를 꺼내올 때 원래의 타입과 다른 타입으로 잘못 형변환되어 발생할 수 있는 오류를 줄여준다.
// 일반 클래스
class Box{
Object item;
void setItem(Object item) { this.item = item; }
Object getItem() { return item; }
}
// 지네릭 클래스
class Box<T>{
T item;
void setItem(T item) { this.item = item; }
T getItem() { return item; }
}
T를 타입변수(type variable)이라고 하며, 임의의 참조형 타입을 의미 하므로 T가 아니라 다른 문자를 사용하여도 된다.
Box<String> b = new Box<String>();
b.setItem(new Object()); // error!
b.setItem("abc"); // Ok
String item = b.getItem(); // 형변환 필요없음
이렇게 사용할 수 있다.
class Box<T> {}
가 선언되어 있다.
Box<T>
는 지네릭 클래스. 'T의 Box'또는 'T Box'라고 읽는다.
T
는 타입변수 또는 타입 매개변수.(T는 타입문자)
Box
는 원시타입(raw type)
Box<String> b = new Box<String>();
이렇게 선언되어 있다.
이 처럼 타입 매개변수에 타입을 지정하는 것을 '지네릭 타입 호출'이라고 한다.
지정된 타입 'String'을 '매개변수화된 타입(parameterized type); 대입된 타입' 이라고한다.
Box<String>과 Box<Integer>는 별개의 클래스가 아니다. 컴파일 후에는 원시타입인 Box로 바뀐다.