본문으로 바로가기

Comparable, Comparator 인터페이스 차이

category 백엔드/Java 2019. 2. 25. 13:30
<Comparable>
import java.util.Arrays;
class Friend {
private String name;
private int age;
public Friend(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class testClass1 {
public static void main(String[] args) {
Friend kim = new Friend("Kim", 28);
Friend park = new Friend("Park", 18);
Friend lee = new Friend("Lee", 36);
Friend yong = new Friend("Yong", 20);
Friend[] friends = {kim, park, lee, yong};
Arrays.sort(friends);
}
}
이 코드를 실행하면 Exception in thread "main" java.lang.ClassCastException: test1.Friend cannot be cast to java.lang.Comparable 에러가 뜬다.
sort() 메소드로 넘긴 정렬 대상인 Friend 클래스를 Comparable로 캐스팅할 수 없다는 것이다.
Friend 클래스에 정렬 기준이 없기 때문에 정렬 기준을 정해주는 코드가 추가되어야 한다.
이를 정해주기 위해서 Comparable 인터페이스를 구현해주면 된다.
class Friend implements Comparable<Friend> {
private String name;
private int age;
public Friend(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int compareTo(Friend o) {
return this.age - o.age;
}
}
Comparable 인터페이스를 구현하려면 compareTo() 메소드를 오버라이딩해야 하는데, 이 메소드가 바로 정렬 규칙을 정하는 메소드이다.
기준을 정한 후, 이 객체가 매개변수의 객체보다 작으면 음수, 같으면 0, 크면 양수를 반환하면 된다.
<Comparator>
그렇다면 그 기본규칙 외에 다른 규칙으로 정렬하고 싶다면 어떻게 해야 할까?
여기서 등장하는 인터페이스가 바로 Comparator 인터페이스 이다.
class SortFriendByNameInAsc implements Comparator<Friend> {
@Override
public int compare(Friend o1, Friend o2) {
return o1.getName().compareTo(o2.getName());
}
}
기본규칙인 '나이(age)'순 정렬이 아닌, '이름(name)' 순서로 정렬하고자 한다.
Comparator 인터페이스를 구현하는 경우 compare() 메서드를 구현해서 규칙을 정해야 한다.
Comparable의 compareTo() 메서드와 다르게 매개변수를 두 개 받는다.
Comparator는 비교대상 객체 외부에 생성하므로 비교할 대상 두 개에 대한 정보를 모두 매개변수로 받는 것이다.
public class testClass1 {
public static void main(String[] args) {
Friend kim = new Friend("Kim", 28);
Friend park = new Friend("Park", 18);
Friend lee = new Friend("Lee", 36);
Friend yong = new Friend("Yong", 20);
Friend[] friends = {kim, park, lee, yong};
//Arrays.sort(friends);
Arrays.sort(friends, new SortFriendByNameInAsc());
}
}
<결론>
Comparable : 이 인터페이스를 구현한 객체 스스로에게 부여하는 한 가지 기본 정렬 규칙을 설정하는 목적으로 사용한다.
Comparator : 이 인터페이스를 구현한 클래스는 정렬 규칙 그 자체를 의미하며, 기본 정렬 규칙과 다르게 원하는대로 정렬순서를 지정하고 싶을 때 사용한다.


'백엔드 > Java' 카테고리의 다른 글

조회수 카운트 동시성 이슈 정리  (0) 2023.11.19
자바의 Final 이란?  (0) 2020.07.30
java.util.Date와 java.sql.Date 차이  (0) 2019.12.17
다형성 & Upcasting & Downcasting  (0) 2018.11.10