getString(Map<? super K,?> map, K key)
위는 제네릭(Generics)의 복잡한 문법으로 자바 제네릭의 하한 경계 와일드 카드(Lower Bounded WildCards)이다.
`? super K`
이 문법은 K 타입이거나 K의 상위(부모) 타입 중 하나를 의미한다. `?`는 와일트카드로서 알 수 없는 타입을 뜻하고 어느 것이든 들어갈 수 있다는 말이다. `super K`는 타입을 제한하는데, 기준이 되는 K보다 상위 클래스여야 한다.
예를들어 `K`가 `Integer`라면 `? super K`가 될 수 있는 타입은 `Integer`, `Number`, `Object` 등이 된다.
Key 부분의(? super K) 타입은 반드시 `K` 타입이거나 `K`의 부모 타입이어야 한다. 이것은 K라는 인스턴스를 이 맵의 키로 사용할 수 있음을 보장하기 위함이다. 부모 타입에는 자식 타입을 담을 수 있기 때문이다. Value 부분(?)은 어떤 타입이든 상관 없다는 말이다. -> Unbounded Wildcard
getString(map, key) 메서드 입장에서 `map`은 외부에서 전달받은 `key`를 소모(Consume)하여 값을 찾아야 하는 대상이다. 만약 `Map<K, ?>`라고 딱딱하게 선언했다면, 정확히 `K` 타입인 맵만 전달할 수 있다. 하지만 `Map<? super K, ?>`라고 선언하면, `K`를 처리할 수 있는 더 넓은 범위의 맵도 인자를 받을 수 있게 되어 메서드의 재사용성이 높아진다.
public String getString(Map<? super Integer, ?> map, Integer key) {
Object value = map.get(key);
return value != null ? value.toString() : null;
}
// 활용 사례
Map<Number, String> numberMap = new HashMap<>(); // Number는 Integer의 부모
numberMap.put(10, "Ten");
// ? super Integer 덕분에 Map<Number, ?> 타입도 전달 가능!
getString(numberMap, 10);
위는 super를 사용하므로써 `Integer`를 담을 수 있는 넓은 범위의 맵을 모두 수용할 수 있게 된다.
'자바' 카테고리의 다른 글
| Java에서 Record가 뭘까? (0) | 2025.12.17 |
|---|---|
| [Java] 제네릭 메서드와 정적 메서드: 왜 ResponseDTO.<T>builder()는 되고 ResponseDTO<T>.builder()는 안 될까? (0) | 2025.01.28 |