Effective Java 책을 보다가 궁금증이 생겼다.
일단, 'Effective Java 2nd edition' 에서 소개되는 'Generics' 에서 사용되는 용어를 살펴보자.
Term | Example |
Parameterized type | List<String> |
Actual type parameter | String |
Generic type | List<E> |
Formal type parameter | E |
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 설계에 문제가 있을 가능성이 농후하다.
'Programming > Java' 카테고리의 다른 글
Eclipse (이클립스) 에서 Java compiler 설정 (0) | 2012.11.27 |
---|---|
Java Map 을 선언과 동시에 초기화 하기 (0) | 2012.11.27 |
Java 버전 1.5 부터 소개된 enum 에 대해서 (0) | 2012.11.27 |
enum type constant-specific method 구현 (0) | 2012.11.27 |
Android app (안드로이드 앱) 개발시 지켜야 할 코드 스타일 제안 (0) | 2012.11.27 |