자바 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}