JAVA

[JAVA] comparable, comparator 비교

hail2y 2024. 7. 3. 13:56

https://st-lab.tistory.com/243

 

자바 [JAVA] - Comparable 과 Comparator의 이해

아마 이 글을 찾아 오신 분들 대개는 Comparable과 Comparator의 차이가 무엇인지 모르거나 궁금해서 찾아오셨을 것이다. 사실 알고보면 두 개는 그렇게 어렵지 않으나 아무래도 자바를 학습하면서 객

st-lab.tistory.com

comparable과 comparator는 아래의 메서드를 필수적으로 오버라이드해야 한다. 왜냐하면 이들은 인터페이스이기 때문.

이 둘은 모두 객체를 비교할 수 있도록 만든다. primitive 자료형과 달리 객체 간 비교에서는 객체 내부의 속성 중 어떤 걸 가지고 비교해야 할지 기준이 모호한데 이들이 이 기준을 정해준다고 생각하면 된다. 비슷한 듯 다른 이들의 차이는 비교 대상의 다름이다.

Comparable Comparator
- compareTo(T o) : 자기 자신과 매개변수를 비교
- 정수 반환 (자기 자신을 기준으로 차이 값 반환)
- import 필요 없음(lang 패키지)
- overflow 발생할 여지 있는지 반드시 확인

- compare(T o1, T o2): 두 매개변수 객체를 비교
- 정수 반환 (객체 자체와 상관없이 독립적으로 매개변수 객체 간 비교) 
- import 필요 (util 패키지)
- overflow 발생할 여지 있는지 반드시 확인

 

* Comparator를 통해 compare 메서드를 사용하려면 어떤 객체가 하나가 필요하다.

예를 들어, 객체 a, b, c가 있을 때 ㅁ.compare(a,b), ㅁ.compare(b,c), ㅁ.compare(c,a) 이런 식으로 ㅁ에 들어갈 객체가 필요한데 a, b, c 중 아무거나 와도 상관이 없다. 다시 말해, 이 코드는 일관성이 떨어진다는 문제가 있는데, 객체 비교만을 위한 객체를 하나 더 생성한다고 해도 껍데기 뿐인 객체에 개별 속성이란 의미가 없어서 여전히 단점이 존재한다. 그래서 이런 경우에는 익명 객체(클래스)를 활용한다!

  • 익명 객체: 클래스 이름으로 정의되지 않은 객체, 이름이 정의되지 않은 하나의 새로운 클래스 
  • 이름이 정의되지 않기 때문에 특정 타입으로 존재하지 않아 반드시 익명 객체는 상속할 대상이 있어야 한다.
  • 상속은 extends와 더불어 implements까지 포함

다시 Comparator로 돌아가서 바라보면, Comparator는 interface이기 때문에 익명 객체를 만들 수 있다는 것이다. 더불어, 외불에서 익명 객체로 Comparator가 생성되기 때문에 클래스에서 Comparator를 구현할 필요가 없어진다. (필요에 따라 main 함수 밖에서 static으로 선언해도 되고 지역변수로서 non-static으로 생성해도 된다.)

  • 익명 객체를 사용하면 여러 가지 비교 기준을 정의할 수 있다는 것이 장점이다.

Comparable을 Comparator처럼 익명 객체로 선언하는 것은 불필요하다. 왜냐하면 Comparable은 자기자신과 매개변수로 들어오는 객체 하나와 비교하는데, 익명 객체로 선언하면 '익명 객체-어떤 클래스 객체' 간의 비교가 되면서 동일한 타입과의 비교가 불가능해지기 때문이다.  이와 같은 이유로, Comparable은 기본(default) 순서를 정의하는 데 사용되며, Comparator는 특별한(specific) 기준의 순서를 정의할 때 사용된다고 한다. 

 

정렬 메서드인 Arrays.sort() 코드에도 Comparable, Comparator로 구현되어 있어 기본 메커니즘을 이해하는 것은 필수이다.

  • 기본적으로 정렬 알고리즘은 오름차순으로 구현 
    - 선행 원소보다 후행 원소보다 더 크면 음수를 반환하여 두 원소의 위치를 교환 안 함.
    - 후행 원소보다 선행 원소보다 더 크면 양수를 반환하여 두 원소의 위치를 교환함.
  • 내림차순의 경우 둘을 반대로 위치
  • 세부적인 정렬 기준을 원한다면(ex. 제1기준이 같을 때 제2기준을 통한 정렬을 원한다면) 직접 구현

 

https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html#method.summary

 

Comparable (Java Platform SE 8 )

This interface imposes a total ordering on the objects of each class that implements it. This ordering is referred to as the class's natural ordering, and the class's compareTo method is referred to as its natural comparison method. Lists (and arrays) of o

docs.oracle.com

https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#method.summary

 

Comparator (Java Platform SE 8 )

Compares its two arguments for order. Returns a negative integer, zero, or a positive integer as the first argument is less than, equal to, or greater than the second. In the foregoing description, the notation sgn(expression) designates the mathematical s

docs.oracle.com

https://st-lab.tistory.com/243

 

https://kbj96.tistory.com/49