Skip to content

Latest commit

 

History

History
59 lines (44 loc) · 2.18 KB

이왕이면_제네릭_메서드로_만들라.md

File metadata and controls

59 lines (44 loc) · 2.18 KB

아이템 30. 이왕이면 제네릭 메서드로 만들라

제네릭 메서드로 개선하는 예시

  • 매개변수화 타입(예: List<String>)을 받는 정적 유틸리티 메서드는 보통 제네릭이다.

    • 예) CollectionsbinarySearch, sort
  • 제네릭을 사용하지 않는, 문제가 있는 메서드 (컴파일은 되지만 경고 발생)

    public static Set union(Set s1, Set s2) {
        Set result = new HashSet(s1);
        result.addAll(s2);
        return result;
    }
  • 개선된 버전(제네릭 메서드 사용)

    public static <E> Set<E> union(Set<E> s1, Set<E> s2) {
        Set<E> result = new HashSet<>(s1);
        result.addAll(s2);
        return result;
    }
    • 타입 매개변수 목록(<E>): 메서드의 제한자와 반환 타입 사이에 위치
    • E, T의 차이는? E는 리스트, 컬렉션 등의 원소(Element)에 사용, T는 Type에 사용 [출처]
    • 한정적 와일드카드 타입(아이템 31)을 사용하면 더 유연하게 개선 가능

제네릭 싱글턴 팩터리

  • 제네릭은 런타임에 타입 정보가 소거된다.

  • 따라서 요청한 타입 매개변수에 맞게 타입을 바꿔 주는 정적 팩터리를 만들어야 한다.

  • 예시: 항등함수 메서드

    private static UnaryOperator<Object> IDENTITY_FN = (t) -> t;
    
    @SuppressWarnings("unchecked") // 경고 무시
    public static <T> UnaryOperator<T> identityFunction() {
        return (UnaryOperator<T>) IDENTITY_FN;
    }
    • UnaryOperator<Object>UnaryOperator<T>가 아니기 때문에 경고 발생함
    • 그대로 반환하기 때문에 경고를 숨겨도 안심할 수 있음

재귀적 타입 한정

  • 재귀적 타입 한정: <T extends Comparable<T>>

  • 주로 Comparable 인터페이스와 함께 쓰인다.

  • 예시

    public static <E extends Comparable<E>> E max(Collection<E> c);
    • 재귀적 타입 한정을 이용해 상호 비교할 수 있음을 표현했다.