자바

(이펙티브 자바) 아이템 30. 이왕이면 제네릭 메서드로 만들라

주누 2020. 10. 6. 01:35

이번 아이템은 메서드를 만들때 이왕이면 제네릭 메서드로 만들것을 권장한다.
명시적으로 형변환을 해주어야하는 메서드 보다는 제네릭 메서드로 만들면 형변환이 필요없어지며 새로운 사용자가 유입되었을때 훨씬 편리하게 코드를 작성할 수 있도록 도와준다는 점을 강점으로 들고 있다.

 

 

아래 코드는 컴파일시에 문제는 없지만 경고문구가 발생한다.

(사실 책에는 경고문구가 발생한다고 기술되어있지만 나의 인텔리제이에서는 경고 문구가 뜨질 않는다. 아마 JVM 5, 6 버전에서 발생하는 경고 문구인 것 같다.)

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

발생하는 이유는 Set에 무슨타입이 들어올지 모르기 때문이다.

Set<String> 일지, Set<Integer>일지..

 

그러기 때문에 우리는 해당 코드를 타입 세이프하게 만들어주어야한다. 그것에 대한 해답이 바로 제네릭이다.

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

jwdeveloper.tistory.com/23

 

(JAVA) 제네릭의 사용

제네릭을 사용하는 이유 제네릭 타입을 사용함으로써 잘못된 타입이 선언되어 런타임 시점에 발생하는 오류를 컴파일 시점에서 제거할 수 있다. 제네릭은 클래스와 인터페이스, 메소드를 정의�

jwdeveloper.tistory.com


제네릭 싱글톤 팩터리 패턴

때로는 불변 객체를 여러 타입으로 활용할 수 있게 만들어야 할 때가 있다. 제네릭은 런타임에 타입 정보가 소거되므로 하나의 객체를 어떤 타입으로든 매개변수화할 수 있다. 하지만 이렇게 하려면 요청한 타입 매개변수에 맞게 매번 그 객체의 타입을 바꿔주는 정적 팩터리를 만들어야 한다.

이를 제네릭 싱글톤 팩터리 패턴이라 한다. 다음 항등함수(identity function)에 대한 코드를 보자.

 

private static UnaryOperator<Object> IDENTIFY_FN = (t) -> t;

@SuppressWarnings("unchecked")
public static<T> UnaryOperator<T> identityFunction() {
    return  (UnaryOperator<T>) IDENTIFY_FN;
}

항등함수객체는 무상태이니 요청마다 매번 새로 만드는 것은 낭비다. 그리고 타입별로 하나씩 만들어야 했겠지만 소거 방식을 사용한 덕에 제네릭 싱글턴 하나면 충분하다. 이 코드는 비검사 형변환 경고가 발생하지만 항등함수는 언제나 같은 값을 반환하는 특별한 함수이므로 (unaryOperator<T>)를 사용해도 타입 안전하다. 그러니 @SuppressWarnings로 경고를 숨겨도 안심할 수 있다.