https://st-lab.tistory.com/243
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
https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#method.summary
https://st-lab.tistory.com/243
'JAVA' 카테고리의 다른 글
[JAVA] 직렬화, 역직렬화 개념 (1) | 2024.10.02 |
---|---|
[JAVA] 큐(Queue), 덱(Deque) 구현체, 메서드 정리 (0) | 2024.09.30 |
[JAVA] 자바와 C언어 메모리 구조 비교 (0) | 2024.08.19 |
[JAVA] System.in.read() (1) | 2024.06.30 |
[JAVA] delete(), deleteCharAt() (0) | 2024.05.07 |