본문 바로가기
Java Study

바운딩과 와일드카드의 차이

by xogns93 2024. 8. 19.

제네릭에서 바운딩(Bounding)와일드카드(Wildcards)는 자바의 타입 시스템에서 중요한 개념입니다. 두 개념 모두 제네릭을 사용할 때 타입의 유연성을 제공하지만, 그 사용 목적과 방법에는 차이가 있습니다.

바운딩 (Bounding)

바운딩은 제네릭 타입 매개변수에 대한 상한 또는 하한을 설정하는 것을 의미합니다. 제네릭 클래스나 메서드를 정의할 때, 특정 타입이나 그 서브타입만 사용할 수 있도록 제한할 수 있습니다. 바운딩은 주로 상한 바운드(Upper Bound)와 하한 바운드(Lower Bound)로 나뉩니다.

상한 바운드 (Upper Bound)

  • 상한 바운드를 설정하면, 제네릭 타입 매개변수는 특정 클래스의 서브클래스나 해당 클래스 자체로 제한됩니다.
  • 예를 들어 T extends NumberTNumber 클래스 또는 Number의 서브클래스여야 함을 의미합니다.
class MyClass<T extends Number> {
    private T value;

    public MyClass(T value) {
        this.value = value;
    }

    public T getValue() {
        return value;
    }
}

여기서 TNumber 클래스 또는 Number를 상속한 클래스(Integer, Double, Float 등)만 사용할 수 있습니다.

하한 바운드 (Lower Bound)

  • 하한 바운드는 주로 와일드카드(? super Type)와 함께 사용됩니다.
  • 특정 타입과 그 상위 타입을 사용할 수 있게 제한합니다.
public <T> void addNumbers(List<? super Integer> list) {
    list.add(new Integer(1));
    list.add(new Integer(2));
}

여기서 List<? super Integer>Integer 또는 Integer의 상위 클래스(Number, Object)를 허용합니다.

와일드카드 (Wildcards)

와일드카드는 제네릭 타입에 유연성을 추가하기 위해 사용됩니다. 와일드카드는 ? 기호로 표현되며, 특정한 제네릭 타입 대신에 사용됩니다. 와일드카드는 제네릭 클래스나 메서드에서 인스턴스화할 때 타입의 경계를 설정할 수 있습니다.

와일드카드 종류

  • 언바운디드 와일드카드 (Unbounded Wildcard): ?
    • 특정 타입에 구애받지 않고, 모든 타입을 허용합니다.
    • 예: List<?>List<String>, List<Integer> 등 모든 타입의 리스트를 허용합니다.
public void printList(List<?> list) {
    for (Object elem : list) {
        System.out.println(elem);
    }
}
  • 상한 바운드 와일드카드 (Upper Bounded Wildcard): ? extends Type
    • 특정 클래스나 그 서브클래스만 허용합니다.
    • 예: List<? extends Number>List<Integer>, List<Double> 등을 허용합니다.
public double sum(List<? extends Number> list) {
    double sum = 0.0;
    for (Number num : list) {
        sum += num.doubleValue();
    }
    return sum;
}
  • 하한 바운드 와일드카드 (Lower Bounded Wildcard): ? super Type
    • 특정 클래스나 그 상위 클래스만 허용합니다.
    • 예: List<? super Integer>List<Integer>, List<Number>, List<Object> 등을 허용합니다.
public void addIntegers(List<? super Integer> list) {
    list.add(new Integer(10));
    list.add(new Integer(20));
}

차이점 요약

  • 바운딩은 제네릭 타입 매개변수에 제한을 설정하여, 특정 클래스나 그 서브클래스 또는 상위 클래스만 사용할 수 있도록 합니다. 주로 제네릭 클래스나 메서드의 정의에서 사용됩니다.
  • 와일드카드는 제네릭 타입을 사용할 때 타입 매개변수의 경계를 설정하거나 유연성을 제공하는 데 사용됩니다. 와일드카드는 타입 인스턴스화 시에 유연한 매개변수로 사용됩니다.

이 두 개념은 제네릭의 타입 안정성을 유지하면서도, 보다 유연한 코드를 작성할 수 있도록 돕는 중요한 도구들입니다.