jaynamm/playground

✅ Info: 제네릭 타입 와일드카드

Opened this issue · 0 comments

제네릭 타입에 대해서

컨트롤러에서 ResponseEntity<?> 를 반환 타입으로 API 를 이용해 데이터를 보내고 있다.

public ResponseEntity<?> loginCheck(@RequestBody Map<String, String > loginMember) {
...
}

제네릭 타입

위와 같이 제네릭 타입에 물음표(?) 를 사용해주었는데 물음표가 무엇을 의미하는지 궁금해서 찾아봤다.
아래와 같이 와일드카드를 사용해서 제네릭의 타입을 지정해줄 수 있다고 한다.
따라서, 물음표는 타입 변수에 모든 타입을 사용할 수 있도록 해주는 와일드카드라고 보면 된다.

와일드카드는 반환 타입이 unknown 타입으로 타입이 정해지지 않았기 때문에 어떠한 값도 구분없이 호출할 수 있어 범위가 무제한이라고 한다. 활용도가 높다는 장점을 가지고 있지만 와일드카드로 물음표를 사용해 타입을 지정한 채 값을 넣는다면 컴파일 에러가 발생한다.

예시로 아래와 같이 확인할 수 있다.

@Test
void genericTest() {
    Collection<?> c = new ArrayList<String>();
    c.add(new Object()); // 컴파일 에러
}

와일드카드를 사용하는 경우에 있어 캐스팅 문제 등에 대해 유연하게 풀고자 할 때 사용하기도 한다는데
타입을 정확하게 명시하는게 나은지 아니면 와일드 카드를 사용해서 괜찮은지에 대한 이해가 부족한 것 같아
잠깐 훑어봤기 때문에 어떤 상황에서 와일드 카드를 사용하는지에 대해서도 더 찾아봐야겠다.

와일드카드의 사용
와일드카드(wild card)란 이름에 제한을 두지 않음을 표현하는 데 사용되는 기호를 의미합니다.

자바의 제네릭에서는 물음표(?) 기호를 사용하여 이러한 와일드카드를 사용할 수 있습니다.

문법
<?> // 타입 변수에 모든 타입을 사용할 수 있음.
<? extends T> // T 타입과 T 타입을 상속받는 자손 클래스 타입만을 사용할 수 있음.
<? super T> // T 타입과 T 타입이 상속받은 조상 클래스 타입만을 사용할 수 있음.

reference

http://www.tcpschool.com/java/java_generic_various
https://mangkyu.tistory.com/241
https://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html