Wild Card<?>와 Generic method

0

Generic

목록 보기
5/6

와일드 카드란?

  • 하나의 참조 변수로 대입된 타입이 다른 객체를 참조 가능
    하나의 참조변수로 여러 객체를 가르키고 싶지만 타입이 일치해야하는 답답함을 해소 시켜줌 즉, 하나의 참조변수로 서로 다른 타입이 대입된 지네릭 객체를 다루기 위한 것
ArrayList<? extends Product> list = new ArrayList<Tv>(); // OK
ArrayList<? extends Product> list = new ArrayList<Audio>(); // OK
ArrayList<Product> list = new ArrayList<Tv>(); // 에러, 대입된 타입 불일치
  • 와일드 카드의 세가지 용법

  • 메서드의 매개변수에 와일드 카드를 사용

static Juice makeJuice(FruitBox<? extends Fruit> box) {
					//Fruit과 그 자손을 받을 수 있다.
	. . .
    . . .
}

Generic method

  • 지네릭 타입이 선언된 메서드(타입 변수는 메서드 내에서만 유효)
static <T> void sort(List<T> list, Comparator<? super T> c)
  • 클래스의 타입 매개변수<T>와 메서드의 타입 매개변수 <T>는 별개
class FruitBox<T> { // 지네릭 클래스
	static<T> void sort(List<T> list, Comparator<? super T> c) {
    	// 지네릭 메소드
        // 클래스와 메소드의 타입문자가 일치하지만 다른 타입변수이다.
        // 메소드의 타입변수는 메소드 안에서만 사용      
        // instance variable, local variable의 차이를 생각하면 된다.
    }
}
  • 메서드를 호출할 때마다 타입을 대입해야함(대부분 생략 가능)
FruitBox<Fruit> fruitBox = new FruitBox<Fruit>();
FruitBox<Apple> appleBox = new FruitBox<Apple>();
	. . . 
Juicer.<Fruit>makeJuice(fruitBox)); 
Juicer.<Apple>makeJuice(appleBox)); 

static <T extends Fruit> Juice makeJuice(FruitBox<T> box) {
					//Fruit 또는 그 자손만 대입 가능
	. . .
    . . .
}
  • 메서드를 호출할 때 타입을 생략하지 않을 때는 클래스 이름 생략 불가
  • 지네릭 메서드는 메서드를 호출할 때마다 다른 지네릭 타입을 대입할 수 있게 한것이다.

0개의 댓글