본문 바로가기
Java/Generic

와일드카드 타입

by Backchus 2020. 7. 2.

와일드카드 타입(<?>, <? extends ...>, <? super ...>)

코드에서 ?를 일반적으로 와일드카드(wildcard)라고 부른다. 제네릭 타입을 매개값이나 리턴 타입으로 사용할 때 구체적인 타입 대신에 다음과 같이 세 가지 형태로 사용할 수 있다.

  • 제네릭타입<?>: Unbounded Wildcards(제한 없음)
    • 타입 파라미터를 대치하는 구체적인 타임으로 모든 클래스나 인터페이스 타입이 올 수 있다.
  • 제네릭타입<? extends 상위타입>: Upper Bounded Wildcards(상위 클래스 제한)
    • 타입 파라미터를 대치하는 구체적인 타입으로 상위 타입이나 하위 타입만 올 수 있다.
  • 제네릭타입<? super 하위타입>: Lower Bounded Wildcards(하위 클래스 제한)
    • 타입 파라미터를 대치하는 구체적인 타입으로 하위 타입이나 상위 타입이 올 수있다.

다음 코드를 보면서 이해해보자. 제네릭 타입 Course는 과정 클래스로 과정 이름과 수강생을 저장할 수 있는 배열을 가지고 있따. 타입 파라미터 T가 적용된 곳은 수강생 타입부분이다.

public class Course<T> {
    private String name;
    private T[] students;

    public Course(String name, int capacity) {
        this.name = name;
        // 타입 파라미터로 배열을 생성하려면 new T[n] 형태로 배열을 생성할 수 없다.
        students = (T[]) (new Object[capacity]);  
    }

    public String getName() { return name; }
    public T[] getStudents() { return students; }
    public void add(T t) {
        for(int i=0; i<students.length; i++) {
            if(students[i] == null) {
                students[i] = t;
                break;
            }
        }
    }
}

수강생이 될 수 있는 타입은 다음 4가지 클래스라고 가정하자. Person의 하위 클래스로 Worker와 Student가 있고, Student의 하위 클래스로 HighStudent가 있다.

Person <- Worker
Person <- Student <- HighStudent
  • Course<?> : 수강생은 모든 타입(Person, Worker, Student, HighStudent)이 될 수 있다.
  • Course<? extends Student> : 수강생은 Student와 HighStudent만 될 수 있다.
  • Course<? super Worker> : 수강생은 Workder와 Person만 될 수 있다.

참고 서적: 이것이 자바다(신용권 저)

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

제네릭 타입의 상속과 구현  (0) 2020.07.02
제한된 타입 파라미터  (0) 2020.07.02
제네릭 메소드  (0) 2020.07.02
제네릭 타입  (0) 2020.07.02