본문 바로가기

Programming/Java

Bounded wildcard type vs Bounded type parameter

Effective Java 책을 보다가 궁금증이 생겼다.


일단, 'Effective Java 2nd edition' 에서 소개되는 'Generics' 에서 사용되는 용어를 살펴보자.


Term

Example

Parameterized type

List<String> 

Actual type parameter

String 

Generic type 

List<E> 

Formal type parameter

Unbounded wildcard type 

List<?> 

Raw type 

List 

Bounded type parameter 

<E extends Number> 

Recursive type bound 

<T extends Comparable<T>> 

Bounded wildcard type 

List<? extends Number> 

Generic method 

static <E> List<E> asList(E[] a) 

Type token 

String.class 


위 표에서 주황색으로 색칠 된 두 가지 개념 (Bounded type parameter, Bounded wildcard type) 이 약간 혼동이 되었다.

무슨 차이일까?

책을 묵상하고 웹에서 자료를 찾은 결과, 두 용어의 차이점이 명확하게 이해가 되었다.

가장 큰 차이점은 다음과 같다.

Bounded type parameter 는 여러개의 interface 를 동시에 상속 받을 수 있는 등의 여러개의 상한선이 있는 반면에, Bounded wildcard type 은 상한선이 한개 뿐이라는 것이다.

예를 들어서,

Bounded type parameter 의 경우에는  E extends Number & Interface1 & Interface2 & ...

Bounded wildcard type 의 경우에는 List<? extends Number> or List<? super Number>

과 같은 형태를 가질 수 있는 것이다.


덧 붙여서, wildcard type 은 method 의 return type 으로 사용하지 않는 것이 좋다. 왜냐하면 이렇게 하게 되면 이 클래스의 사용자는 자신의 코드에 wildcard type 을 사용해야 하기 때문이다. 클래스 설계에서 사용자가 wildcard 를 사용하도록 하는 것은 권장되지 않는 사항이다. 사용자는  wildcard type 이 사용되었다는 사실을 모르고 클래스를 사용할 수 있는 유연성을 클래스로부터 제공받아야 한다. 그래서 클래스의 사용자가 wildcard type 에 대해서 고민하게 하는 것은 클래스의 API 설계에 문제가 있을 가능성이 농후하다.