1. 둘의 공통점과 차이점
(1) 공통점
- 객체를 비교하기 위해 어떤 객체가 더 높은 우선순위를 갖는지 판단하기 위해 사용한다.
(2) 차이점
- Comparable은 자기 자신과 매개변수 객체를 비교
- Comparator는 두 매개변수 객체를 비교
비교한다는 것 자체는 같지만, 비교 대상이 다르다!
2. Comparable Interface
- Comparable 인터페이스는 객체를 정렬하는 데 사용되는 메서드인 compareTo() method를 정의한다.
- JAVA에서 같은 타입의 인스턴스를 서로 비교해야만 하는 클래스들은 모두 Comparable 인터페이스를 구현하고 있다.
- Boolean을 제외한 래퍼 클래스나 String, Time, Date와 같은 클래스의 객체 모두 정렬 가능하다.
(1) 오름차순 정렬
import java.util.Arrays;
public class ComparableExample {
public static void main(String[] args) {
Member member1 = new Member(2, "A");
Member member2 = new Member(3, "B");
Member member3 = new Member(1, "C");
Member [] members = {member1, member2, member3};
Arrays.sort(members);
System.out.println(Arrays.toString(members));
}
private static class Member implements Comparable<Member> {
private int id;
private String name;
public Member(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public int compareTo(Member o) {
if(this.id == o.id)
return 0;
else if(this.id < o.id)
return -1;
else
return 1;
//return this.id - o.id; //간단하게 한줄로 구현 가능
}
}
}
- Member Class에서 Comparable 인터페이스를 구현한다.
- compareTo method 오버라이딩
- this 필드가 크면 양수 return
- 매개변수가 크면 음수 return
- 간단하게 한 줄로 구현할 때 자료형의 underflow, overflow 주의해야 한다!
(2) 내림차순 구현
@Override
public int compareTo(Member o) {
if(this.id == o.id)
return 0;
else if(this.id < o.id)
return 1;
else
return -1;
}
- 오름차순과 반대로 구현한다.
- this 필드가 크면 음수 return
- 매개변수 필드가 크면 양수 return
compareTo method 구현을 수정하지 않고 Arrays.sort method 옵션을 사용하여 구현 가능
Arrays.sort(members, Collections.reverseOrder());
3. Comparator Interface
- Comparator 인터페이스를 구현한 클래스에서는 compare() method를 오버 라이딩하여 사용한다.
- "두 매개변수 객체를 비교"
(1) 오름차순
import java.util.Arrays;
import java.util.Comparator;
public class ComparatorExample {
public static void main(String[] args) {
Member member1 = new Member(2, "A");
Member member2 = new Member(3, "B");
Member member3 = new Member(1, "C");
Member[] members = {member1, member2, member3};
Arrays.sort(members, new Member());
System.out.println(Arrays.toString(members));
}
private static class Member implements Comparator<Member> {
private int id;
private String name;
public Member() {
}
public Member(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public int compare(Member o1, Member o2) {
if(o1.id > o2.id)
return 1;
else if(o1.id == o2.id)
return 0;
else
return -1;
}
}
}
- Arrays.sort(members, new Member())를 추가해주어야 한다.
Comparator 구현 클래스 정의 없이 Comparator 인스턴스 생성과 동시에 compare() method를 오버라이드 하는 것도 가능
Arrays.sort(members, new Comparator<Member>() {
@Override
public int compare(Member o1, Member o2) {
if(o1.id > o2.id)
return 1;
else if(o1.id == o2.id)
return 0;
else
return -1;
}
});
(2) 내림차순
@Override
public int compare(Member o1, Member o2) {
if(o1.id > o2.id)
return -1;
else if(o1.id == o2.id)
return 0;
else
return 1;
}
- 오름차순과 반대로 구현한다.
- this 필드가 크면 음수 return
- 매개변수 필드가 크면 양수 return
반응형
'Java' 카테고리의 다른 글
[JAVA] String Methods (String 클래스 method) (0) | 2021.11.05 |
---|---|
[JAVA] Iterator Interface (0) | 2021.10.14 |
[JAVA] List 정렬(Sort)하기 (feat. Collections.class) (0) | 2021.10.01 |
[JAVA] 배열 정렬(Sort)하기 (feat. Arrays.class) (0) | 2021.09.30 |
[JAVA] 컬렉션 프레임웍 (Collections Framework) (0) | 2021.09.21 |
댓글