Study

지네릭 - 와일드 카드

스파이더웹 2022. 8. 9. 00:23
728x90
반응형

와일드 카드란 ? 지네릭 타입에 다형성을 적용하는 방법

와일드 카드는  기호 "?" 로 표현이 되는데, 'extends' 와 'super' 로 상한과 하한을 제한할 수 있다


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

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

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

728x90

 

Study 아래 두개의 차이점 ?

public static void printAll(ArrayList<? extends Product> list, ArrayList<? extends Product> list2) {...}
public static <T extends Product> void PrintAll(ArrayList<T> list, ArrayList<T> list2) {...}

 

아래 코드를 살펴보자

public class GenTest {

    public static void main(String[] args) {
        ArrayList<Tv> tv = new ArrayList<>();
        tv.add(new Tv("삼성"));
        tv.add(new Tv("LG"));

        ArrayList<Audio> audio = new ArrayList<>();
        audio.add(new Audio("오디오"));

        printAll(tv,audio);
        printAll2(tv,audio);//컴파일 오류
    }

    public static void printAll(ArrayList<? extends Product> list, ArrayList<? extends Product> list2) {
        for (Product product : list) {
            System.out.println("list1 : "+product);
        }

        for (Product product : list2) {
            System.out.println("list2 : "  + product );
        }
    }

    public static <T extends Product> void printAll2(ArrayList<T> list3, ArrayList<T> list4) {
        for (Product product : list3) {
            System.out.println("list3 : "+product);
        }

        for (Product product : list4) {
            System.out.println("list4 : "  + product );
        }
    }
}

class Product {

}

class Tv extends Product {
    String tv;

    public Tv(String tv) {
        this.tv = tv;
    }

    public String getTv() {
        return tv;
    }
}

class Audio extends Product{
    String audio;

    public Audio(String audio) {
        this.audio = audio;
    }

    public String getAudio() {
        return audio;
    }
}

위의 예제를 간단하게 코드로 구현해보았다. 

코드로 보니 쉽게 알 수있는데, 두가지의 가장 큰 차이점은 "?" 와일드카드의경우 Product 자손 클래스면 매개변수로 넘겨줄 수 있다 

그러나 "T" 타입의 경우 Product 자손 중에 T를 특정한다는 것이므로 두개의 매개변수로 동일한 특정타입 하나로 매개변수로 넘겨줘야한다. 즉, 예제에서는 Tv면 Tv, Audio면 Audio 하나로 통일을 해줘야 한다

728x90
반응형