JAVA/Effective JAVA

[이펙티브 자바] Item14. Comparable을 구현할지 고민하라. (Comparable 구현 방법 #2)

초보보 혜진 2023. 2. 6. 14:58
728x90

 

[이펙티브 자바] Item14. Comparable을 구현할지 고민하라.

[이펙티브 자바] Item14. Comparable을 구현할지 고민하라. (Comparable 구현 방법 #1) (tistory.com)

 

[이펙티브 자바] Item14. Comparable을 구현할지 고민하라. (Comparable 구현 방법 #1)

[이펙티브 자바] Item14. Comparable을 구현할지 고민하라. [이펙티브 자바] Item14. Comparable을 구현할지 고민하라. (compareTo 기본 규약) (tistory.com) [이펙티브 자바] Item14. Comparable을 구현할지 고민하라. (co

hyejin.tistory.com

저번 글에서는 Comparable을 구현하는 방법 첫번째로 Comparable 인터페이스를 구현하고 compareTo 메서드를 재정의한다고 했다. 

 

 

 

👾 자바8에서는 Comparator 인터페이스가 일련의 비교자 생성 메서드(comparator construction method)을 사용해 메서드 연쇄 방식으로 비교자를 생성할 수 있게 됐다.

-> 자바8부터 함수형 인터페이스, 람다, 메서드 레퍼런스와 Compartor가 제공하는 기본 메서드와 static 메서드를 사용해서 Comparator를 구현할 수 있다. 

 

 

Compartor가 제공하는 메서드 사용하는 방법 

1️⃣ Compartor의 static 메서드를 사용해서 Comparator 인스턴스 만들기 

private static final Comparator<PhoneNumber> COMPARATOR =

 

2️⃣ 인스턴스를 만들었다면 default 메서드를 사용해서 메서드 호출 이어가기 (메서드 체이닝) 

private static final Comparator<PhoneNumber> COMPARATOR =
      Comparator.comparingInt((PhoneNumber pn) -> pn.areaCode)
      .thenComparing(pn -> pn.prefix)
      .thenComparing(pn -> pn.lineNum);

-> 이 코드는 비교자 생성 메서드 2개를 이용해 비교자를 생성한다. 

먼저 comparingInt는 객체 참조를 int 타입 키에 매핑하는 키 추출 함수(key extractor function)를 인수로 받아, 그 키를 기준으로 순서를 정하는 비교자를 반환하는 정적 메서드다. 

 

여기서는 PhoneNumber에서 추출한 지역 코드를 기준으로 전화번호의 순서를 정하는 Compartor<PhoneNumber>를 반환한다. 

그리고 두 전화번호의 지역 코드가 같을 수 있으니 비교 방식을 더 다듬기 위해서 두번째 비교자 생성 메서드 thenComparingInt가 수행한다. thenComparingInt는 Comparator의 인스턴스 메서드로,  int 키 추출자 함수를 입력받아 다시 비교자를 반환한다. 

 

 

 

3️⃣  static 메서드와 default 메서드의 매개변수로 람다 표현식 또는 메서드 레퍼런스를 사용할 수 있다. 

@Override
public int compareTo(PhoneNumber pn)
{
   return COMPARATOR.compare(this, pn);
}

 

 

 

 

👩‍💻 결론 

순서를 고려해야 하는 값 클래스를 작성한다면 꼭 Comparable 인터페이스를 구현하여 그 인스턴스들을 쉽게 정렬하고, 검색하고, 비교 기능을 제공하는 컬렉션과 어우러지도록 해야한다!! 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90