스파이더 웹 개발

지네릭 - 와일드 카드 본문

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
반응형

'Study' 카테고리의 다른 글

쿠키(Cookie)와 세션(Session)  (0) 2022.08.14
일급 객체  (0) 2022.08.11
정규 표현식  (0) 2022.08.08
ArrayList 용량이 늘어나는 기준  (0) 2022.08.06
Collection.clear( ) 와 Collection.removeAll( ) 의 차이  (0) 2022.08.06
Comments