개발하는 두더지

[Effective Java 규칙27] 가능하면 제네릭 메서드으로 만들 것 본문

Java,Android

[Effective Java 규칙27] 가능하면 제네릭 메서드으로 만들 것

덜지 2018. 10. 4. 18:12

[Effective Java 규칙27] 가능하면 제네릭 메서드으로 만들 것

Effective Java 2/E 책과 구글링을 통해 내용을 정리하고 개인적인 견해가 포함된 글입니다.


제네릭을 사용하면 클래스 뿐만 아니라 메서드도 효과를 본다. static 유틸 메서드는 특히 제네릭화하기 좋다. Collections에 구현된 모든 알고리즘 메서드는 제네릭으로 구현되어 있다. 


두 집합의 합집합을 구하는 메서드를 제네릭을 이용하여 구현하면 아래와 같다.

public static <E> Set<E> union(Set<E> s1, Set<E> s2) {
Set<E> result = new HashSet<>(s1);
result.addAll(s2);
return result;
}

컴파일러는 메서드에 전달된 인자의 자료형을 보고 무슨 타입인지 알아 낸다.  Set<String> 을 사용한다면 E가 String이라는 것을 알아낼 수 있는데 이 과정을 자료형 유추(type inference) 라고 한다.



다른 예로,

Comparable을 구현하는 자료형의 리스트를 인자로 받는 메서드을 많이 볼 수 있다. 이런 메서드는 리스트를 정렬, 탐색, 최댓값, 최소값을 계산할 수 있는데, 이런 작업이 가능하려면 리스트 내의 원소들이 서로 비교 가능해야 한다.

public static <T extends Comparable<T>> T max(List<T> list) {
Iterator<T> i = list.iterator();
T result = i.next();
while(i.hasNext()) {
T t = i.next();
if(t.compareTo(result) > 0)
result = t;
}
return result;
}
<T extends Comparable<T>>

자기 자신과 비교 가능한 모든 자료형 T 라고 생각하면 된다. 
















Comments