제네릭에서 바운딩(Bounding)과 와일드카드(Wildcards)는 자바의 타입 시스템에서 중요한 개념입니다. 두 개념 모두 제네릭을 사용할 때 타입의 유연성을 제공하지만, 그 사용 목적과 방법에는 차이가 있습니다.
바운딩 (Bounding)
바운딩은 제네릭 타입 매개변수에 대한 상한 또는 하한을 설정하는 것을 의미합니다. 제네릭 클래스나 메서드를 정의할 때, 특정 타입이나 그 서브타입만 사용할 수 있도록 제한할 수 있습니다. 바운딩은 주로 상한 바운드(Upper Bound)와 하한 바운드(Lower Bound)로 나뉩니다.
상한 바운드 (Upper Bound)
- 상한 바운드를 설정하면, 제네릭 타입 매개변수는 특정 클래스의 서브클래스나 해당 클래스 자체로 제한됩니다.
- 예를 들어
T extends Number
는T
가Number
클래스 또는Number
의 서브클래스여야 함을 의미합니다.
class MyClass<T extends Number> {
private T value;
public MyClass(T value) {
this.value = value;
}
public T getValue() {
return value;
}
}
여기서 T
는 Number
클래스 또는 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));
}
차이점 요약
- 바운딩은 제네릭 타입 매개변수에 제한을 설정하여, 특정 클래스나 그 서브클래스 또는 상위 클래스만 사용할 수 있도록 합니다. 주로 제네릭 클래스나 메서드의 정의에서 사용됩니다.
- 와일드카드는 제네릭 타입을 사용할 때 타입 매개변수의 경계를 설정하거나 유연성을 제공하는 데 사용됩니다. 와일드카드는 타입 인스턴스화 시에 유연한 매개변수로 사용됩니다.
이 두 개념은 제네릭의 타입 안정성을 유지하면서도, 보다 유연한 코드를 작성할 수 있도록 돕는 중요한 도구들입니다.
'Java Study' 카테고리의 다른 글
파라미터화된 타입(Parameterized Type)과 원시 타입(Raw Type) (0) | 2024.08.19 |
---|---|
제네릭 타입 매개변수(T)와 와일드카드(?)의 역할 (0) | 2024.08.19 |
List와 ArrayList (0) | 2024.08.16 |
자바(JAVA)의 예외(Exception) (0) | 2024.07.19 |
LinkedList (0) | 2024.07.18 |