Language/Java

Java - 제네릭(Generic)타입을 제한하는 방법! (2)

JaeHoney 2022. 5. 8. 14:26

제네릭(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