공부하는 스누피

[Java] 와일드 카드 (Wildcards) 본문

Languages/Java

[Java] 와일드 카드 (Wildcards)

커피맛스누피 2021. 3. 14. 01:04

와일드 카드

와일드 카드는 제네릭 코드에서 물음표(?)로 표기되어 있는 것을 말하며, 아직 알려지지 않은 타입을 나타냅니다.

1) Bounded Wildcards (한정적 와일드카드)

Upper Bounded Wildcards (extends를 사용한 한정적 와일드카드)

: 타입의 제한을 풀어줄 때 사용합니다. 제네릭 타입들을 상위 제네릭 타입으로 묶어주는 것이라고 할 수 있습니다.

public static void process(List<? extends Foo> list) { /* ... */ }

Lower Bounded Wildcards (super를 사용한 한정적 와일드카드)

: 타입을 제한할 때 사용합니다. 유연성을 극대화하기 위해 지정된 타입의 상위 타입만 허용하도록 합니다.

// Integer의 상위 타입일 경우 허용 (Object, Number, Integer)
public static void addNumbers(List<? super Integer> list) { ... }

2) Unbounded Wildcards (비한정적 와일드카드)

: 와일드카드 문자인 ?만 사용할 때 비한정적 와일드카드라고 하며, 알려지지 않은 타입의 리스트라고 불립니다. 다음과 같은 상황일 때 비한정적 와일드카드가 쓰입니다.

  1. Object class에서 제공하는 메서드일 때
  2. 매개 변수 타입에 의존하지 않는 제네릭 클래스의 메서드를 사용할 때

메서드 printList(List<Object>)의 경우 어떤 타입이라도 상관없이 출력하려고 만들었지만, 정작 List

의 원소로든 Object 타입만 허용합니다.

List<String>List<Object>의 하위 타입이 아니라는 뜻 ... (중략)
List<String>List<Object>가 하는 일을 제대로 수행하지 못하니 하위 타입이 될 수 없다 ... (후략)
(Effective Java. 181p.)

반면 printList(List<?>)에서는 List<String>이나 List<Integer> 등 모든 타입이 List<?>의 하위 타입이기 때문에 어떤 타입의 List라도 타입을 보존한 채 출력할 수 있습니다.

단, Object에는 Object의 하위 타입을 넣을 수 있지만 List<?>에는 null만 넣을 수 있습니다. List<?>에 어떤 타입의 List가 올지 모르기 때문에 타입이 존재하는 값을 넣을 수 없기 때문입니다.

 

docs.oracle.com/javase/tutorial/java/generics/wildcards.html

 

Wildcards (The Java™ Tutorials > Learning the Java Language > Generics (Updated))

The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available. See Java Language Changes for a summary of updated

docs.oracle.com

 

Comments