# 제네릭

임성혁·2022년 8월 28일

자바 기초

목록 보기
30/32

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. 용어

  • Box〈T〉 : 제네릭 클래스 'T의 box' 또는 'T box'라고 읽음
  • T : 타입 변수 또는 타입 매개변수
  • Box : 원시 타입, raw Type
    class Box<t> {}
    Box : 원시타입
    Box<String> b = new Box<String>()
    <String> : 매개변수화된 타입

4. 제약사항

  • static을 허용하지 않음

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와 그 조상들만 가능
<?> : 모든 타입이 가능
profile
열정

0개의 댓글