코린이의 소소한 공부노트

와일드카드 ?와 지네릭 메서드 본문

Java

와일드카드 ?와 지네릭 메서드

무지맘 2022. 11. 14. 23:00

[와일드카드 ‘?’ 사용 이유]

- 지네릭 타입을 이용한 선언문 작성 시 타입이 같아야 한다..

ArrayList<Product> list = new ArrayList<Product>(); // OK
list = new ArrayList<Tv>(); // 지네릭 타입이 달라서 에러
list = new ArrayList<Audio>(); // 지네릭 타입이 달라서 에러

 - 지네릭 타입에 와일드카드를 쓰면, 하나의 참조변수로 여러 타입의 객체를 참조할 수 있다.

ArrayList<? extends Product> list = new ArrayList<Tv>(); // OK
list = new ArrayList<Audio>(); // OK

 

[와일드카드 사용 방법]

1. <? extends T>

  - 와일드카드의 상한 제한

  - T와 그 자손들만 가능

2. <? super T>

  - 와일드카드의 하한 제한

  - T와 그 조상들만 가능

3. <?>

  - 제한 없음

  - 모든 타입 가능

  - <? extends Object>와 등일

4. 와일드카드에는 <? extends T & E>와 같이‘ &’를 사용할 수 없다.

5. 메서드의 매개변수에 와일드카드를 사용할 수 있다.

static Juice makeJuice(FruitBox<? extends Fruit> box) { } // ?가 없다면 Fruit만 가능

FruitBox<Fruit> fruitBox = new FruitBox<Fruit>();
FruitBox<Apple> appleBox = new FruitBox<Apple>();
...
Juicer.makeJuice(fruitBox); // OK
Juicer.makeJuice(appleBox); // OK

 

[지네릭 메서드]

1. 반환 타입 앞에 지네릭 타입이 선언된 메서드(타입 변수는 메서드 내에서만 유효)

static <T> void sort(List<T> list, Comparator<? super T> c) { }

2. 클래스의 타입 매개변수 <T>와 메서드의 타입 매개변수 <T>는 별개의 타입이다.

class FruitBox<T>{ // 지네릭 클래스
    static <T> void sort(List<T> list, Comparator<? super T> c) { } // 지네릭 메서드
    ...
} // 타입 문자가 일치하지만, 실제로는 다른 타입 변수다.

3. 지네릭 메서드를 호출할 때마다 타입 변수에 타입을 대입해야 한다.(대부분의 경우 추정이 가능하므로 생략할 수 있음.)

static <T extends Fruit> Juice makeJuice(FruitBox<T> box) { } // 지네릭 메서드

FruitBox<Fruit> fruitBox = new FruitBox<Fruit>();
FruitBox<Apple> appleBox = new FruitBox<Apple>();

Juicer.<Fruit>makeJuice(fruitBox); // OK. T=Fruit
Juicer.makeJuice(appleBox); // OK. T=Apple이고 Apple은 Fruit의 자손

4. 메서드를 호출할 때 타입을 생략하지 않을 때는 클래스 이름 생략을 할 수 없다.

<Fruit>makeJuice(fruitBox); // 에러. 클래스 이름 붙여줘야함
this.<Fruit>makeJuice(fruitBox); // OK
Juicer.<Fruit>makeJuice(fruitBox); // OK

 

[와일드카드와 지네릭 메서드의 차이점]

- 와일드카드는 하나의 참조변수로 서로 다른 타입이 대입된 여러 지네릭 객체를 다루기 위한 것

- 지네릭 메서드는 메서드를 호출할 때마다 다른 지네릭 타입을 대입할 수 있게 한 것

'Java' 카테고리의 다른 글

열거형(enum, enumerated type)  (0) 2022.11.17
지네릭 타입의 형변환과 제거  (0) 2022.11.14
지네릭 클래스의 예시와 제한  (0) 2022.11.14
지네릭스와 다형성  (0) 2022.11.09
지네릭스  (0) 2022.11.09