와일드카드 extends / super 사용시기

PECS 공식

  • PESC 란, Producer-Extends / Consumer-Super 라는 단어의 약자인데 다음을 의미한다.

    • 외부에서 온 데이터를 기반으로 생산(Producer) 한다면 <? extends T> 를 사용 (하위타입으로 제한)

    • 내부 데이터를 소비(Consumer) 해 외부 자원에 적재한다면 <? super T> 를 사용(상위타입으로 제한)

class MyArrayList<T> {
    Object[] element = new Object[5];
    int index = 0;

    // 외부로부터 리스트를 받아와 매개변수의 모든 요소를 내부 배열에 추가하여 인스턴스화 하는 생성자
    public MyArrayList(Collection<? extends T> in) {
        for (T elem : in) {
            element[index++] = elem;
        }
    }

    // 외부로부터 리스트를 받아와 내부 배열의 요소를 모두 매개변수에 추가해주는 메서드
    public void clone(Collection<? super T> out) {
        for (Object elem : element) {
            out.add((T) elem);
        }
    }
}

Producers Extend

  • 위 예제에서 extends 가 쓰이는 곳은 생성자 메서드의 매개변수 부분이다.

  • 즉, 외부에서 온 데이터를 매개변수에 담아 for 문으로 순회하여 MyArrayList 를 인스턴스화(생성) 하는 생산자(Producer) 역할을 하고 있다고 말할 수 있다.

Consumer Super

  • 외부에서 리스트를 받아 요소를 복사하여 적재하는 clone 메서드의 매개변수에는 super 와일드카드 키워드가 쓰였다.

  • 즉, MyArrayList 의 내부 배열을 소비하여 매개변수 리스트에 적재하는 행위를 하고 있다고 볼 수 있는 것이다.

Last updated