맞는데 왜 틀릴까..?

Java/Effective Java

[Effective Java] Item 30. 이왕이면 제네릭 메서드로 만들라

안도일 2023. 5. 9. 22:17

클래스와 마찬가지로 메서드도 제네릭으로 만들 수 있다. 형변환이 필요한 기존 메서드를 제네릭 메서드로 만들자.

 

 

Union 메서드

 

로 타입

 

로 타입을 사용해 구현한 Union 메서드

 

 

컴파일은 되지만 타입 안정성을 보장하지 못한다.

 

 

제네릭 메서드

 

로 타입으로 구현한 Union을 제네릭 메서드로 변경해 보자.

 

  • 메서드 선언에 세 집합 (입력 2개, 반환 1개)의 원소 타입을 타입 매개변수로 명시
  • 메서드 안에서 이 타입 매개변수만 사용하도록 수정
  • 타입 매개변수 목록 (<E>)은 메서드의 제한자와 반환 타입 사이에 위치

 

 

타입 매개변수 목록 : <E>

반환 타입 : Set <E>

 

경고 없이 컴파일되며, 타입 안전하고, 직접 형변환 하지 않아도 된다.

 

 

 

 

제네릭 싱글턴 팩터리

 

  • 때때로 불변 객체를 여러 타입으로 활용할 수 있게 만들어야 할 때가 있다.
  • 제네릭은 런타임에 타입 정보가 소거되므로 하나의 객체를 어떤 타입으로든 매개변수화 할 수 있다. ( 런타임에서는 해당 객체가 어떤 타입으로 매개변수화되었는지 알 수 없다.)

 

매개변수화(Parameterization)

클래스나 메서드를 정의할 때 타입을 결정하지 않고, 이후 사용될 때 타입을 지정하는 것.
이를 통해 코드의 재사용성과 유연성이 증가하며, 타입 안정성을 보장할 수 있다.

예를 들어, 자바에서 제공하는 List 인터페이스는 여러 타입의 객체를 저장할 수 있는 컬렉션인데, 만약 List 인터페이스를 사용할 때 타입을 결정하지 않고 나중에 사용될 때 지정할 수 있게 하고 싶다면 제네릭을 사용하여 매개변수화된 타입을 정의할 수 있다.
List <String>, List <Integer>와 같이 매개변수화된 타입을 사용할 수 있다.

 

요청한 타입 매개변수에 맞게 매번 그 객체의 타입을 바꿔주는 정적 팩터리를 만드는 패턴을 제네릭 싱글턴 팩터리라 한다.

뭔 소리냐

 

 

항등함수 클래스

 

 

이 코드는 제네릭 메서드인 identityFunction()을 정의한다.

IDENTITY_FN은 객체를 입력으로 받아서 그대로 반환한다.

identityFunction() 메서드는 타입  매개변수 <T>를 가지며, UnaryOperator <T>를 반환한다.

이 메서드는 IDENTITY_FN을 형변환하여 반환하는데, 이를 통해 호출하는 쪽에서 타입 안전성을 보장받고 입력된 객체를 그대로 반환하는 함수를 사용할 수 있다.

 

 

 

 

재귀적 타입 한정

 

재귀적 타입 한정 : 자기 자신이 들어간 표현식을 사용하여 타입 매개변수의 허용 범위를 한정

 

재귀적 타입 한정은 주로 타입의 자연적 순서를 정하는 Comparable 인터페이스와 함께 사용된다.

 

public interface Comparable<T> {
    int compareTo(T o);
}

 

  • 타입 매개변수 T는 Comparable <T>를 구현한 타입이 비교할 수 있는 원소의 타입을 정의한다.
  • 거의 모든 타입은 자신과 같은 타입의 원소와만 비교할 수 있다.

 

Comparable을 구현한 원소의 컬렉션을 입력받는 메서드들은 컬렉션에 담긴 모든 원소를 상호 비교해 원하는 동작을 수행한다. 아래는 해당 동작을 수행해 최댓값을 계산하는 메서드다.

 

 

타입 한정인 <E extends Comparable <E>>는 "모든 타입 E는 자신과 비교할 수 있다"라는 뜻이다.

컬렉션에 담긴 원소의 자연적 순서를 기준으로 최댓값을 계산한다.

 

아직 이해 못 하겠다.

 


 

제네릭 타입과 마찬가지로, 클라이언트에서 입력 매개변수와 반환값을 명시적으로 형변환해야 하는 메서드보다 제네릭 메서드가 더 안전하고 사용하기 쉽다.

따라서 형변환을 해줘야 하는 기존 메서드는 제네릭하게 만들자.

 

참고해보자

https://joyerim.tistory.com/70 

 

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

이번 아이템의 핵심은 “제네릭 클래스 이외에도 제네릭 메소드 또한 만들 수 있다”이다. 책에서는 이에 대해 제네릭 메소드 작성법을 설명하는 것이다. 핵심을 놓치지 말자.. 제네릭 public class

joyerim.tistory.com