IT/Programming / / 2023. 4. 27. 09:27

<Effective Java> RULE 27 가능하면 제네릭 메서드로 만들 것

반응형

 

제네릭 메서드?

제네릭 메서드는 매개 타입과 리턴 타입으로 타입 파라미터를 갖는 메소드를 말합니다.

public <타입 파라미터, ...> 리턴 타입 메소드명(매개변수, ...) { ... }
 
// 제네릭 메서드
public static <E> Set<E> union(Set<E> s1, Set<E> s2){
    Set<E> result = new HashSet<E>(s1);
    result.addAll(s2);
    return result;
}
 
// 제네릭 메서드 용례
public static void main(String[] args){
    Set<String> guys = new HashSet<String>(
        Arrays.asList("Tom", "Dick", "Harray"));
    Set<String> stooges = new HashSet<String>(
        Arrays.asList("Larry", "Moe", "Culy"));
    Set<String> aflCio = union(guys, stooges);
    System.out.println(aflCio);
}

// [Moe, Harray, Tom, Culy, Larry, Dick]이라고 찍히며 순서는 달라질 수 있다.
 

· 제네릭 메서드의 특징은 제네릭 생성자를 호출할 때는 명시적으로 주어야 했던 형인자를 전달할 필요가 없다는것.

// 제네릭 정적 팩토리 메서드
public static <K, V> HashMap<K, V> newHashMap(){
    return new HashMap<K, V>();
}

// 정적 팩토리 메서드를 통한 형인자 자료형 객체 생성
Map<String, List<String>> anagrams = newHashMap();
 
//제네릭 싱글턴 팩토리 패턴
private static UnaryFunction<Object> IDENTIFY_FUNCTION = 
    new UnaryFunction<Object>(){
        public Object apply(Object arg) {return arg; }
    };

// IDENTIFY_FUNCTION은 무상태 객체이며 형인자는 비한정 인자이므로 모든 자료형이
// 같은 객체를 공유해도 안전하다.
public static <T> UnaryFunction<T> identifyFunction(){
    return (UnaryFunction<T>) IDENTIFY_FUNCTION;
}
 
// 제네릭 싱글턴 사용 예제
public static void main(String[] args){
    String[] strings = {"jute", "hemp", "nylon"};
    UnaryFunction<String> sameString = identifyFunction();
    for(String s : strings)
        sysout(sameString.apply(s));
    
    Number[] number = { 1, 2.0, 3L };
    UnaryFunction<Number> sameNumber = identityFunction();
    for(Number n : numbers){
        sysout(sameNumber.apply(n));
}
 

요약

· 제네릭 자료형이나 마찬가지로 제네릭 메서드는 클라이언트가 직접 입력값과 반환값의 자료형을 형 변환해야하는 메서드보다 사용하기 쉽고 형 안전성도 높다.

· 자료형을 만들 때 처럼 새로운 메서드를 고안할 때는 형 변환 없이도 사용할 수 있을 지 살펴 보라

· 자료형의 경우, 시간날 때 기존 메서드를 제네릭 메서드로 확장해 놓으면 기존 클라이언트 코드를 깨지 않고 새 사용자에게 더 좋은 API를 제공할 수 있다.

 

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유