자바 5에 처음 도입되었다.
예제
Box<T>
에서T
는 타입 변수(type variable)이라한다.- 타입변수는 꼭
T
가 아니어도 된다. 예. Map<K,V> - 기호의 종류만 다를 뿐 임의의 참조형 타입을 의미.
- Object 타입을 사용하다보면 형변환을 필수적으로 해줘야하는데 제네릭은 형변환에서 자유롭다.
1class Box<T>{
2 T item;
3
4 void setItem(T item){
5 this.item = item;
6 }
7 T getItem(){
8 return this.item;
9 }
10
11 }
1Box<String> b = new Box<String>();
2b.setItem(new Object()); // 에러남. String 타입으로 넘겨야함
3b.setItem("ABC"); // 성공
4String item = b.getItem(); // 형변환을 하지 않고 가져온다
용어정리
class Box<T> {}
Box<T>
를 제네릭 클래스T
타입변수 또는 타입 매개변수Box
원시타입
특징
- static 메소드에는 타입변수 T를 사용할 수 없다.
T[] tmpArr = new T[5];
와 같은 배열 생성이 불가능하다T[] itemarr;
과 같은 코드는 가능하다.(즉, 참조변수 생성까지만 가능)Box<Fruit> appleBox = new Box<Apple>
자식관계를 반영해주지 않기때문에 이 코드는 에러가 발생한다.
제한된 제네릭 클래스
- 특정 타입변수만 사용하도록 하고 싶을때 사용하는 기능이다.
- T에는 Fruit의 자식 타입만 올 수 있다.
- Fruit가 인터페이스 일때도 extends 키워드를 사용해아한다.
1class FruitBox<T extends Fruit>{
2 ArrayList<T> list = new ArrayList<T>();
3}