와일드카드 vs 제네릭

Jang Seok Woo·2021년 7월 9일
0

실무

목록 보기
34/136

너무나도 잘 정리해두신 분이 계셔서 퍼옴

제네릭 : 지금은 이 타입을 모르지만, 이 타입이 정해지면 그 타입 특성에 맞게 사용하겠다!
와일드 카드 : 지금도 이 타입을 모르고, 앞으로도 모를 것이다!

List<?> list; 
// 1. 원소를 꺼내 와서는 Object에 정의되어 있는 기능만 사용하겠다. equals(), toString(), hashCode()…
// 2. List에 타입이 뭐가 오든 상관 없다. 나는 List 인터페이스에 정의되어 있는 기능만 사용하겠다. size(), clear().. 단, 타입 파라미터와 결부된 기능은 사용하지 않겠다! add(), addAll()

List<T> list;
// 1. 원소를 꺼내 와서는 Object에 정의되어 있는 기능만 사용하겠다. equals(), toString(), hashCode()…
// 2. List에 타입이 뭐가 오든 상관 없다. 나는 List 인터페이스에 정의되어 있는 기능만 사용을 하고, 타입 파라미터와 결부된 기능도 사용하겠다.
@Test
public void sampleCode2() {
    List<Integer> integerList = Arrays.asList(1, 2, 3);

    printList1(integerList);
    printList2(integerList);
}

static void printList1(List<?> list) {
    ## 1. 와일드 카드는 list에 담긴 원소에는 전혀 관심이 없기 때문에 원소와 관련된 add 메소드를 사용할 수 없다.
    ## 2. 단, null은 들어갈 수 있다.
        
    list.add(list.get(1)); // 컴파일 실패
}

static <T> void printList2(List<T> list) {
    ## 1. 제네릭은 list에 담긴 원소에 관심을 갖기 때문에 원소와 관련된 add 메소드를 사용할 수 있다.
    ## 2. 당연히 null도 들어갈 수 있다.
        
    list.add(list.get(1)); // 컴파일 성공
}

기능면에서는 완전히 똑같기 때문에 이왕이면 보기에 조금 더 간결한 와일드 카드를 사용하도록 하자. 메소드의 정의가 복잡할 수록 보기 어려운 법이니까. 사실, 위 차이점 이외에도 와일드 카드의 용도는 더 있다. 제네릭과 합쳤을 때 와일드 카드의 존재는 빛을 본다. 이 부분은 제한된 와일드 카드에 대해서 알아 본 뒤에 다시 알아보자.

출처: https://vvshinevv.tistory.com/55 [왜 모르는가?]

profile
https://github.com/jsw4215

0개의 댓글