본문 바로가기
Java

[JAVA] Comparable Interface vs Comparator Interface

by 걸어가는 신사 2021. 9. 30.

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
반응형

댓글