Generics : 제너릭

7884 단어 JavaJava

참고

자바의 정석



제너릭

  • 제너릭은 다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 컴파일 시의 타입 체크를 해주는 기능이다.

장점

  1. 타입 안정성을 제공
  2. 타입 체크와 형변환을 생략할 수 있으므로 코드가 간결해짐
  • 제너릭 타입은 클래스와 메서드에 선언가능하다.
  • T 를 타입 변수라고 하며 T가 아닌 다른 것을 사용해도 된다. (E : Element, K : Key, V : Value ) 이들은 기호의 종류만 다를 뿐 임의의

class Box<T> {
    T item;
	
    void setItem(T item) { this.item = item; }
    T getItem() { return item; }
}

용어

Box<T> : 제너릭 클래스, T의 Box 또는 T Box 라고 읽는다.
T : 타입 변수 또는 타입 매개 변수. (T는 타입 문자)
Box : 원시 타입



특징

  • static 멤버에는 타입 변수 T 를 사용할 수 없다. static 멤버는 타입 변수에 지정된 타입, 즉 대입된 타입의 종류에 관계 없이 동일한 것이여야 하기 대문이다. 즉, Box<Apple>.itemBox<Grape>.item 이 다른 것이어서는 안된다.


제한된 제너릭 클래스

  • 다음과 같이 지정하면 T는 Fruit의 자손만 타입으로 지정가능하다.

class FruitBox<T extends Fruit> { 
	ArrayList<T> list = new ArrayList<T>();
}

  • 인터페이스를 구현 해야한다는 제약 사양이 있을 때, 다음과 같이 implements 가 아닌 extends 로 사용함
interface Eatable {} 
class FruitBox<T extends Eatable> { ... }

* Fruit의 자손이면서 Eable인터페이스도 구현해야한다면 다음과 같은 & 기호 사용
class FruitBox< T extends Fruit & Eatable> { ... }


### 와일드 카드
< ? extends T >  # 와일드 카드의 상한 제한. T와 그 자손만 가능
< ? super T >    # 와일드 카드의 하한 제한. T와 그 조상만 가능
< ? >            # 제한 없음. 모든 타입이 가능 < ? extends Object > 와 동일
 
  • 아래의 경우 Fruit 자손 타입 아무 것이나 와도됨

  • static 메서드 같은 경우 사용(컴파일 에러 발생)

    
    static Juice makeJuice(FruitBox< ? extends Fruit > box ) {
    	
    }
    


제너릭 메서드

  • 매서드 선언 부에 제네릭 타입이 선언된 메서드

  • 제너릭 타입의 선언 위치는 반환 타입의 바로 옆

    
    class FruitBox<T> {
    	static <T extends Fruit> Juice makeJucie(FruitBox<T> box) {
       	..
           return new Juice(tmp);
       }
    }
    

좋은 웹페이지 즐겨찾기