[제네릭] 제네릭과 와일드카드
■ 와일드카드
제네릭(Generics)은 보통 하나의 타입을 지정, 명시하지만 하나 이상의 타입을 지정해야 하는 경우가 발생할 수 있다. 이를 위해 와일드카드라는 것을 이용해 해결할 수 있다.
와일드카드란 '?'를 이용해 하나 이상의 타입을 가능하게 하는데 여기서 ?는 어떤 타입도 가능하다는 랜덤의 뜻이 아닌가 싶다(?)
ArrayList<? extends Sports> arrList = new ArrayList<>();
ArrayList<?> arrList = new ArrayList<>();
ArrayList<? super Soccer> arrList = new ArrayList<>();
이렇게 3가지 형태로 와일드카드를 쓸 수 있는데,
예를 들어 Sports라는 운동종목을 통틀으는 최상위 클래스가 있다고 하자.
간단히 Sports 하위 클래스로 Skating과 Golf라는 클래스가 존재하며, Skating 클래스 하위에는 SortTrack과 SpeedSkating이라는 하위 클래스가 존재한다.
다음과 같은 그림이 될텐데,
여기서 와일드카드의 쓰임에 따라 추가가 허용되는 타입의 범위가 달라진다.
1. ArrayList<?> arrList : 와일드카드 ?만 왔음으로 모든 스포츠 Sports클래스의 하위 클래스 타입이 올 수 있다.
2. ArrayList<? extends Skating> arrList : Skating과 이를 상속받은 SpeedSkating, SortTrack이 타입으로 올 수 있다.
3. ArrayList<? super Golf> arrList : Golf와 함께 Sports클래스 타입만 올 수 있다.
■ 복수(여러개)의 Generics 사용법
클래스 내에서 여러개의 제네릭(Generics)을 필요로 하는 경우가 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
class Soccer{ public String team; Soccer(String team){ this.team = team; } }
class Player<T, S>{ public T team; public S name;
Player(T team, S name){ this.team = team; this.name = name; } }
public class Generics {
public static void main(String[] args) {
Player<Soccer, String> player = new Player<Soccer, String>(new Soccer("ManUtd"), "JSPark"); System.out.println(); } } |
cs |
복수의 제네릭(Generics)을 사용해야 할 경우 8번째 라인)과 같이 ','를 이용해 복수의 제네릭(Generics)을 명시해주면 된다.
-----------------------------------------------------------------------------------------------------------------------------------
=> 결론 : HttpEntity<PostsUpdateRequestDto> requestEntity = new HttpEntity<PostsUpdateRequestDto>(requestDto); 이렇게 해도 되는듯