반응형
제네릭 메서드?
제네릭 메서드는 매개 타입과 리턴 타입으로 타입 파라미터를 갖는 메소드를 말합니다.
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를 제공할 수 있다.
반응형
'IT > Programming' 카테고리의 다른 글
<Effective Java> RULE 25 배열대신 리스트를 써라 (0) | 2023.04.27 |
---|---|
<Effective Java> RULE 26 가능하면 제네릭 자료형으로 만들 것 (0) | 2023.04.27 |
<Effective Java> RULE 28 한정적 와일드카드를 써서 API 유연성을 높여라 (0) | 2023.04.27 |
<Effective Java> RULE 29 형안전 다형성 컨테이너를 쓰면 어떨지 따져보라 (0) | 2023.04.27 |
<Effective Java> RULE 30 int상수 대신 enum을 사용하라 (0) | 2023.04.27 |