제네릭(Generic) 타입 제한
지난 1장(Java - 제네릭은 무엇인가)에 이어서 제너릭을 사용해서 타입을 제한하거나 와일드카드로 사용하는 방법을 알아본다.
지난 장에서 봤듯 제너릭을 사용하면 타입 체크를 효율적으로 수행할 수 있다.
일반적인 제너릭 형식을 사용한 클래스를 만들었다고 가정하자. 하지만 이 방식으로 클래스를 선언했을 떄 제너릭 타입은 모든 타입을 허용 한다.
public class MyClass <E> implements MyInterface{
private E element;
void set(E element) {
this.element = element;
}
}
해당 클래스의 인스턴스 객체를 생성할 때 제너릭 타입을 명시한다.
MyClass<Type?> instance = new MyClass<>();
여기서 만약 Type에 특정 타입이 들어오면 예외가 생긴다고 가정하자. 또는 특정 몇 개의 타입만 허용해야 한다고 가정하자.
이 때는 제너릭 타입의 범위를 제한해야 한다.
extends, super, ?(wildcard)
제너릭은 범위를 제한하기 위한 방법으로 extends와 super, ?를 지원한다. 각각의 기능을 알아보자.
extends
<K extends T>
extends를 사용하면 특정 타입의 자손 타입만 제너릭 타입으로 들어올 수 있다. (T와 T의 자손 타입만 들어올 수 있다.)
제너릭 타입에서는 클래스뿐만 아니라 인터페이스도 extends 키워드를 사용한다.
super
<K super T>
super를 사용하면 특정 타입의 부모 타입만 제너릭 타입으로 들어올 수 있다. (T와 T의 부모 타입만 들어올 수 있다.)
?(wild card)
<?>
?(물음표)는 와일드 카드를 의미한다. ?를 사용하면 모든 타입이 제너릭 타입으로 들어올 수 있다. <T>를 사용하면 타입 파라미터인 T를 활용할 수 있지만, 와일드카드는 활용할 수 없다. ?는 타입 인자를 받지도 변환하지도 않는다.
추가적으로 <? extends T> 처럼 조합해서 사용할 수도 있다.
Reference
'Language > Java' 카테고리의 다른 글
Effective Java - 빌더 패턴 안전하게 사용하기 (+Use Lombok) (0) | 2022.06.18 |
---|---|
Java - 애노테이션(Annotation)이란 무엇인가 ? (0) | 2022.05.21 |
Java - 제네릭(Generic)은 무엇인가? 에 대한 정리! (1) (0) | 2022.05.08 |
Java - ArrayList가 가변적일 수 있는 이유 (+ Size 지정하는 이유) (0) | 2022.05.07 |
Java - PreparedStatement란 무엇인가? (0) | 2022.05.03 |