Comparable vs Comparator

2025. 4. 30. 16:11·Dev Trivia
728x90

TreeSet이나 TreeMap 같은 컬렉션에 저장되는 객체는 저장과 동시에 오름차순으로 정렬

이때, 어떤 객체든 정렬될 수 있는 것이 아닌, 객체가 `Comparable` 인터페이스를 구현하고 있어야 가능함

Integer, Double, String 타입은 Comparable을 구현하고 있으므로 상관 없음

📌 사용자 정의 객체를 저장할 땐 반드시 Comparable을 구현해야 함

Comparable

comparable 인터페이스에는 `compareTo()` 메소드가 정의돼 있음
∴ 사용자 정의 클래스에서 이 메소드를 재정의하여 비교 결과를 정수 값으로 반환해야 함

리턴 타입 메소드 설명
int compareTo(T o) 주어진 객체와 같으면 0,
주어진 객체보다 적으면 음수,
주어진 객체보다 크면 양수 리턴

Comparator

비교 기능이 있는 구현체를 TreeSet에 저장하거나 TreeMap에 저장하는 게 원칙이지만,
비교 기능이 없는 (= Comparable 비구현) 객체를 저장하고 싶다면 생성 시 `비교자`를 제공하면 됨

TreeSet<E> treeSet = new TreeSet<E>(new ComparatorImpl());
  • 비교자는 `Comparator` 인터페이스를 구현한 객체를 의미
  • comparator 인터페이스에는 `compare()` 메소드가 정의돼 있음
리턴 타입 메소드 설명
int compare(T o1, T o2) o1과 o2가 동등하면 0,
o1이 o2보다 앞에 오려면 음수,
o1이 o2보다 뒤에 오려면 양수 리턴

 예제 👇🏻

더보기

1. Comparable을 구현하지 않은 Fruit 클래스

public class Fruit{
	public String name;
    public int price;
    
    public Fruit(String name, int price){
    	this.name = name;
        this.price = price;
    }
}

 2. Comparator을 구현한 FruitComparator 클래스

public class ComparatorFruit implements Comapartor<Fruit>{
	@Override
    public int compare(Fruit o1, Fruit o2){
    	return o1.price-o2.price;       
    }
}

3. Main

TreeSet<Fruit> set = new TreeSet<>(new ComparatorFruit());

보통은 Comparator를 `익명 구현 객체`나 `람다 표현식`으로 사용함

List<String> list = new ArrayList<>();

// 익명 구현 객체
Collections.sort(list, new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        return o1.compareTo(o2);
    }
});

// 람다 표현식
Collections.sort(list, (o1, o2) -> o1.compareTo(o2));
728x90
'Dev Trivia' 카테고리의 다른 글
  • FrontController
  • DNS
  • [HTML] Attribute vs Property
  • 함수 vs 메서드
0woy
0woy
Algorithm, CS, Web 등 배운 내용을 기록합니다.
  • 0woy
    0woy dev
    0woy
  • 전체
    오늘
    어제
  • 🌐 LANGUAGE
    • 분류 전체보기 (80)
      • Backend (21)
        • JAVA (7)
        • DB (11)
        • Spring (1)
        • Spring Security (2)
      • Computer Science (22)
        • 네트워크 (9)
        • 운영체제 (5)
        • 보안 (7)
      • Frontend (15)
        • HTML5 (1)
        • CSS (1)
        • JS (4)
        • Vue 3 (9)
      • PS (16)
        • LeetCode (2)
        • Baekjoon (1)
        • Programmers (1)
        • 알고리즘 (12)
      • Dev Trivia (6)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    security
    트리
    공개키
    https
    JS
    속성
    JDBC
    Props
    Filter
    DP
    대칭키
    BFS
    그래프
    select
    PreparedStatement
    javascript
    function
    dfs
    RDB
    leetcode
    CA
    tcp
    java
    Spring
    set
    비밀키
    가용성
    shortestpath
    Graph
    Vue3
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.3
0woy
Comparable vs Comparator
상단으로

티스토리툴바