[이펙티브 자바] Item14. Comparable을 구현할지 고민하라. (Comparable 구현 방법 #2)
[이펙티브 자바] 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 인터페이스를 구현하여 그 인스턴스들을 쉽게 정렬하고, 검색하고, 비교 기능을 제공하는 컬렉션과 어우러지도록 해야한다!!