Notice
Recent Posts
Recent Comments
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

충분히 쌓여가는

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

Java/JAVA3

와일드 카드 <?>, 지네릭 메서드

빌드이너프 2023. 7. 28. 09:09

와일드 카드 <?>

하나의 참조 변수로 대입된 타입이 다른 객체를 참조 가능

타입이 일치하지 않아도 된다

ArrayList<? extends Product> list = new ArrayList<Tv>(); // OK
ArrayList<? extends Product> list = new ArrayList<Audio>(); // OK
ArrayList<Product> list = new ArrayList<Tv>(); // 에러, 대입된 타입 불일치

 

와일드 카드의 종류 3가지

<? extends T>: 와일드 카드의 상한제한, T와 그 자손들만 가능

<? super T>: 와일드 카드의 하한제한, T와 그 조상들만 가능

<?>: 제한 없음, 모든 타입이 가능, <? extends Object>와 동일

 

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

static Juice makeJuice(FruitBox<? extends Fruit> box) {
    String tmp = "";
    for(Fruit f : box.getList()) tmp += f + " ";
    return new Juice(tmp);
}

 

Fruit와 Apple 둘 다 사용 가능하다

System.out.println(Juicer.makeJuice(new FruitBox<Furit>())); // Ok
System.out.println(Juicer.makeJuice(new FruitBox<Apple>())); // Ok

 

만약 extends가 아니라면

static Juice makeJuice(FruitBox<Fruit> box) {
    String tmp = "";
    for(Fruit f : box.getList()) tmp += f + " ";
    return new Juice(tmp);
}

 

Fruit만 사용가능하다

System.out.println(Juicer.makeJuice(new FruitBox<Furit>())); // Ok
// System.out.println(Juicer.makeJuice(new FruitBox<Apple>())); // 에러

 

코드

import java.util.ArrayList;

class Fruit		       	{ public String toString() { return "Fruit";}}
class Apple extends Fruit	{ public String toString() { return "Apple";}}
class Grape extends Fruit	{ public String toString() { return "Grape";}}

class Juice {
    String name;

    Juice(String name)       { this.name = name + "Juice"; }
    public String toString() { return name;                }
}

class Juicer {
    static Juice makeJuice(FruitBox<? extends Fruit> box) { // Fruit와 그 자손 가능
        String tmp = "";

        for(Fruit f : box.getList())
            tmp += f + " ";
        return new Juice(tmp);
    }
}

class WildCardTest {
    public static void main(String[] args) {
        FruitBox<Fruit> fruitBox = new FruitBox<Fruit>();
        FruitBox<Apple> appleBox = new FruitBox<Apple>();

        fruitBox.add(new Apple());
        fruitBox.add(new Grape());
        appleBox.add(new Apple());
        appleBox.add(new Apple());

        System.out.println(Juicer.makeJuice(fruitBox));
        System.out.println(Juicer.makeJuice(appleBox)); // 와일드 카드를 사용했기 때문에 가능
    }
}

class FruitBox<T extends Fruit> extends Box<T> {}

class Box<T> {
    ArrayList<T> list = new ArrayList<T>();
    void add(T item) { list.add(item);      }
    T get(int i)     { return list.get(i);  }
    ArrayList<T> getList() { return list;   }
    int size()       { return list.size();  }
    public String toString() { return list.toString();}
}


Apple Grape Juice
Apple Apple Juice

'Java > JAVA3' 카테고리의 다른 글

지네릭 형변환  (0) 2023.07.29
지네릭 메서드  (0) 2023.07.28
제한된 지네릭 클래스, 지네릭스의 제약  (0) 2023.07.27
지네릭스 용어, 지네릭 타입과 다형성  (0) 2023.07.26
타입 변수  (0) 2023.07.25