와일드카드란?
The wildcard ? in Java is a special kind of type argument[1] that controls the type safety of the use of generic (parameterized) types. It can be used in variable declarations and instantiations as well as in method definitions, but not in the definition of a generic type.[
public static<T> void peekBox(Box<T> box){
System.out.println(box);
}// 제네릭 메소드 정의
public static void peekBox(Box<?> box){
System.out.println(box);
}// 제네릭 메소드 정의
- 기능적으로 두 메소드 완전 동일
- 와일드카드의 코드가 간결하므로 권고
와일드카드와 상속
1. Upper Bounded Wildcards
- 상한 제한된 와일드 카드
2. Lower Bounded Wildcards
- 하한 제한된 와일드 카드
Upper Bounded Wildcards
- <? extends Number>
- 타입 인자를 Number을 상속하는 클래스 타입으로 제한
- 상한 제한의 의미: Number을 상한으로 제한
Lower Bounded Wildcards
- <? super Integer>
- 타입 인자를 Integer가 상속하는 클래스 타입(Integer의 상위 클래스: Number, Object, ...)으로 제한
- 하한 제한으 의미: Integer을 하한으로 제한
와일드카드 제한 도입 이유
- 프로그래머의 실수가 컴파일 오류로 들어나지 않는다.
- 안정성을 높일 수 있다.
상한 제한의 목적
왜 set()이 컴파일 에러가 발생할까?
- outBox(Box<? extends Toy> box)에 Box<Car> 또는 Box<Robot> 인스턴스의 전달을 가정해보자.
- box.set(new Toy())의 로직은 Robot ob= new Toy()을 의미한다.
- 참조 변수의 타입은 부모 클래스 타입의 인스턴스를 인자로 전달 받을 수 없다.
하한 제한의 목적
왜 get()이 컴파일 에러가 발생할까?
- Box<Plastic>. 즉, Toy의 상위 클래스를 타입 인자로 갖는 인스턴스의 전달을 가정해보자.
- Toy myToy= box.get()에서 box.get()의 자료형은 Plastic이다.
- 참조 변수의 타입은 부모 클래스 타입의 인스턴스를 인자로 전달 받을 수 없다.
정리
- <? extends Toy>: 꺼내기만 가능(read)
- <? super Toy>: 넣가만 가능(write)
- 컴파일을 통해 프로그래머의 실수를 거를 수 있다.
'Programming > Java' 카테고리의 다른 글
ArrayList vs LinkedList (0) | 2022.02.23 |
---|---|
Collections.sort() (0) | 2022.02.23 |
Generic Method (Basic) (0) | 2022.02.22 |
Generic Class (Basic) (0) | 2022.02.22 |
Collection (0) | 2022.02.11 |