제 홈페이지의 모든 글은 anti-nhn license에 따릅니다.



java Generics 10 - 기존 코드를 Generic을 사용하도록 변경하기

지금까지 기존에 generic을 사용하지 않는 코드와 새로 짠 generic을 사용하는 코드 간의 상호작용에 대해서 알아보았다. 이제 기존 코드를 generic을 사용하도록 바꾸는 좀 더 어려운 작업에 들어가 보자.
generic을 사용하도록 코드를 바꾸기로 결정하면, API를 어떻게 바꿀 것인지 잘 생각해보아야 한다.
기존에 이 API를 사용하던 코드들도 여전히 정상적으로 작동해야 하므로, 지나치게 제약을 주면 안 된다. java.util.Collection를 다시 살펴보자. 아래는 generic을 사용하기 전의 코드다.

interface Collection { 
    public boolean containsAll(Collection c);
    public boolean addAll(Collection c);
}

이를 generic을 사용해서 대충 바꿔보면 아래와 같이 된다.

interface Collection<E> { 
    public boolean containsAll(Collection<E> c);
    public boolean addAll(Collection<E> c);
}


타입이 안전하게 된 것 같아 보이지만, 사실 containsAll()은 어떤 타입의 Collection이든 다 받을 수 있어야 한다. ("인자로 받을 수 있다"와 "결과가 false다"는 다른 얘기다.) 이 메쏘드가 true를 리턴하기 위해서는 인자로 받은 Collection의 E 타입의 값들을 가지고 있어야 할 것이다. 그러나 인자로 넘어오는 Collection이 정확히 E의 타입이란 보장은 없다. E의 서브 타입일 수도 있다.

addAll()에 있어서도 E의 서브 타입이 추가 가능하도록 만들어야 한다. section 5 에서 이 방법에 대해 다루었다.
이런 식으로 generic을 추가할 때는 기존에 이 API를 사용하는 코드들도 정상적으로 작동하도록 해야 한다. 그러니까, generic이 적용되지 않은 코드에서도 정상적으로 작동하도록 해야 한다는 것이다.

이번에는 section 9에서 보았던 Collections.max()를 다시 살펴 보자. 마지막으로 우리가 생각했던 max()의 선언부는 다음과 같다.

public static <T extends Comparable<? super T>>
T max(Collection<T> coll)


괜찮아 보인다. 하지만 generic을 제거하고 생각해 보면 아래와 같이 된다.

public static Comparable max(Collection coll)


하지만 실제로는 아래와 같이 되어야 정상이다.

public static Object max(Collection coll)


즉, 리턴 타입은 Object가 되어야 한다.
이런 경우 타입 변수 T를 이용하여 다시 정의를 하면 다음과 같이 된다.

public static <T extends Object & Comparable<? super T>>
T max(Collection<T> coll)


이것은 multiple bound라는 것의 예다. &를 이용하는 문법이다. T1 & T2 & .. & Tn과 같이 정의된 경우 T는 T1, T2...Tn 의 서브 타입이 되며, 첫번째 T1의 타입으로 erasure가 작동한다.

마지막으로 고려해야 할 사항은 인자로 받는 Collection은 읽기가 가능해야 한다는 것이다. 그래서 JDK에서는 max()가 다음과 같이 정의되어 있다.

public static <T extends Object & Comparable<? super T>>
T max(Collection<? extends T> coll)



맨 마지막 한 페이지 정도는 generic과 직접 관련이 없는 부분이 있어서 뺐습니다. 이것으로 generic 공부 끝~~~

by 삼실청년 | 2008/05/08 19:49 | 컴터질~ | 트랙백 | 핑백(1) | 덧글(0)

트랙백 주소 : http://iilii.egloos.com/tb/4344769
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Linked at 건실성실착실 3실 청년! : .. at 2010/11/05 17:42

... 칙을 wildcard capture라고 부르는데, 이는 컴파일러가 wildcard로 표현된 알 수 없는 타입을 타입 인자로 처리할 수 있게 해준다.java Generics 10 - 기존 코드를 Generic을 사용하도록 변경하기 ... more

:         :

:

비공개 덧글

◀ 이전 페이지          다음 페이지 ▶