이펙티브 자바, 쉽게 정리하기 - item 30. 이왕이면 제네릭 메서드로 만들라
제네릭 메서드 작성법
public static <E/*타입 매개변수 목록*/> Set<E/*반환 타입*/> union(Set<E/*파라미터 타입*/> s1, Set<E> s2) {
Set<E> result = new HashSet<>(s1);
result.addAll(s2);
return result;
}
- 순서대로 타입 매개변수 목록, 반환 타입, 파라미터 타입 3가지를 메서드 시그니처에 입력할 수 있다.
활용 예시
@Test
public void unionTest() {
Set<String> guys = Set.of("톰", "딕", "헤리");
Set<String> stooges = Set.of("래리", "모에", "컬리");
Set<String> aflCio = union(guys, stooges);
System.out.println("aflCio = " + aflCio);
}
Set<String>
타입 2개를 합쳤다.- 입력 2개와 반환 1개 타입이 모두 일치했다.
- 이는 사실 한정적 와일드카드 타입(아이템 31)을 사용하여, 더 유연하게 개선할 수 있다.
제네릭 싱글턴 팩터리
- 제네릭은 런타임에 타입 정보가 소거되므로 하나의 객체를 어떤 타입으로든 매개변수화 할 수 있다.
- 이를 이용해 불변 객체를 여러 타입으로 이용할 수 있게 만들 수도 있다.
public static final <T> Set<T> emptySet() {
return (Set<T>) EMPTY_SET;
}
- 제네릭 싱글턴 팩터리의 예이다.
EMPTY_SET
은Set
로타입 불변객체이다.
private static final UnaryOperator<Object> IDENTITY_FN = (t) -> t;
@SuppressWarnings("unchecked")
public static <T> UnaryOperator<T> identityFunction() {
return (UnaryOperator<T>) IDENTITY_FN;
}
- 위는 제네릭 싱글턴 팩터리로 항등함수를 작성한 예이다.
- 제네릭으로 수용 가능한 어떤 타입이든 작동하는 항등함수이다.
UnaryOperator
를 어떤 타입이든 계속해서 이용할 수 있다.
- 제네릭으로 수용 가능한 어떤 타입이든 작동하는 항등함수이다.
@Test
public void identityFunctionTest() {
String[] strings = { "삼베", "대마", "나일론" };
UnaryOperator<String> sameString = identityFunction();
for (String string : strings) {
System.out.println(sameString.apply(string));
}
Number[] numbers = {1, 2.0, 3L};
UnaryOperator<Number> sameNumber = identityFunction();
for (Number number : numbers) {
System.out.println(sameNumber.apply(number));
}
}
재귀적 타입한정 이용하기
- 제네릭의 타입 범위를 한정하는 것이다.
public static <E extends Comparable<E>> E max(Collection<E> c);
E
로 받을 타입은 오직Comparable<E>
를 구현한 타입만 가능하다는 뜻이다.- 즉,
Comparable
을 구현한 타입만 가능하다는 뜻이다.
- 즉,
핵심 정리
- 클라이언트에서 입력 매개변수 및 반환값을 명시적으로 형변환하는 메서드보다 제네릭 메서드가 더 안전하고 사용하기도 쉽다.
- 형 변환은 런타임 시에 에러를 동반하기 쉬우므로 제네릭을 사용하자.
반응형
'Java > 이펙티브 자바' 카테고리의 다른 글
이펙티브 자바, 쉽게 정리하기 - item 32. 제네릭과 가변인수를 함께 쓸 때는 신중하라 (0) | 2022.01.24 |
---|---|
이펙티브 자바, 쉽게 정리하기 - item 31. 한정적 와일드카드를 사용해 API 유연성을 높이라 (0) | 2022.01.24 |
이펙티브 자바, 쉽게 정리하기 - item 29. 이왕이면 제네릭 타입으로 만들라 (0) | 2022.01.09 |
이펙티브 자바, 쉽게 정리하기 - item 28. 배열보다는 리스트를 사용하라 (0) | 2022.01.09 |
이펙티브 자바, 쉽게 정리하기 - item 27. 비검사 경고를 제거하라 (0) | 2022.01.09 |