1. 정의
- 컴파일시 타입을 체크해주는 기능
- 객체의 타입 안정성을 높이고 형변환의 번거로움을 줄여줌
- 타입 안정성 제공
- 타입체크와 형변환을 생략할 수 있으므로 코드 간결
2. 클래스 선언
- 클래스를 작성할 때, Object타입 대신 T와 같은 타입 변수를 사용
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대신 실제 타입을 지정하면 형변환 생략 가능
- Box〈String〉 b = new Box〈String〉();
- b.setItem(new Object()) // 에러남
- b.setItem("집가고 싶다") // 출력
- String item =
(String)b.getItem()
3. 용어
4. 제약사항
5. 제네릭 클래스의 객체 생성과 사용
- 제네릭 클래스 Box〈T〉의 선언 (2번 참조)
- Box〈T〉의 객체 생성. 참조 변수와 생성자에 대입된 타입이 일치
- Box〈Apple〉 appleBox = new Box〈Apple〉()
- Box〈Apple〉 appleBox = new Box〈Grape〉() // 에러
- 두 제네릭 클래스가 상속관계이고, 대입된 타입이 일치는 허용
- Box〈Apple〉 appleBox = new FruitBox〈Apple〉();
- Box〈Apple〉 appleBox = new Box<>(); // 생략가능 jdk 1.7부터
- 대입된 타입과 다른 타입의 객체는 추가 안됨
- Box〈Apple〉 appleBox = new Box〈Apple〉();
- appleBox.add(new Grape()) // 타입에러 컴파일 에러
6. 제한된 제네릭 클래스
- 제네릭 타입에 extends를 사용하면, 타입의 자손들만 대입 가능
class FruitBox<T extends Fruit>{}
FruitBox<Fruit> fruitBox = new FruitBox<Fruit>();
fruitBox.add(new Apple())
furitBox.add(new Grape())
7. 와일드 카드 '?'
- 제네릭 타입에 와일드 카드를 사용하면 여러 타입을 대입 가능
- 단, 와일드 카드에는 〈? extends T & E〉& 쓰는 건 불가능
<? extends T> : 와일드 카드의 상한 제한, T와 그 자손들만 가능
<? super T> : 와일드 카드의 하한 제한, T와 그 조상들만 가능
<?> : 모든 타입이 가능