AVA - 지네릭스(Generics) (4)

4982 단어 JavaJava

와일드카드

<? extends T> : 와일드 카드의 상한 제한. T와 그 자손들만 가능
<? super T>   : 와일드 카드의 하한 제한. T와 그 조상들만 가능
<?>			  : 제한 없음. 모든 타입이 가능.<? extends Object>와 동일

지네릭 메서드

메서드의 선언부에 지네릭 타입이 선언된 메서드르 지네릭 메서드라고 한다.

Collections.sort()가 바로 지네릭 메서드이며, 지네릭타입의 선언 위치는 반환 타입 바로 앞이다.

//지네릭 타입이 선언된 메서드(타입 변수는 메서드 내에서만 유효)
static <T> void sort(List<T> list, Comparator<? super T> c)

//클래스 타입 매개변수 <T>와 메서드의 타입 매개변수 <T>는 별개
class FruitBox<T>{
	..
    static<T> void sort(List<T> list, Comparator<? upser T> c){
    
    }
}
  • 메서드 호출할 때 마다 타입을 대입해야 가능 ( 대부분 생략이 가능함)
FruitBox<Fruit> fruitBox = new FruitBox<Fruit>();
FruitBox<Apple> appleBox = new FruitBox<Apple>();

System.out.println(Juicer.<Fruit>makejuice(fruitBox));	//메서드 호출, 타입 대입
System.out.println(Juicer.<Apple>makejuice(appleBox));  //메서드 호출, 타입 대입

static<T extends Fruit> Juice makeJuice(FruitBox<T> box) {
	String tmp =" ";
    for(Fruit f : box.getList()) tmp += f+ " ";
    return new Juice(tmp);
}
  • 메서드를 호출할 때 타입을 생략하지 않을 때는 클래스 이름 생략 불가
System.out.println(<Fruit>makeJuice(fruitBox));	//에러 클래스 이름 생략 불가
System.out.println(this.<Fruit>makeJuice(fruitBox));	//ok
System.out.println(juicer.<Fruit>makeJuice(fruitBox));	//ok
  • 지네릭 메서드는 메서드를 호출할 때 마다 다른 지네릭 타입을 대입할 수 있게 한 것
  • 와일드 카드는 하나의 참조변수로 서로 다른 타입이 대입된 여러 지네릭 객체를 다루기 위한 것.

좋은 웹페이지 즐겨찾기