본문 바로가기

JAVA

Comparable , Comparator 인터페이스 차이점

Comparable , Comparator 인터페이스는 모두 객체의 정렬과 관련된 인터페이스입니다.

 

  • Comparable은 클래스 내부에 객체의 정렬 기준을 만들어 놓을 때 사용됩니다. 이 인터페이스를 구현한 객체에게 주는 한 가지 기본 정렬 규칙을 지정해 주는 것입니다. 
  • Comparator 인터페이스는 클래스 외부에 객체의 정렬기준을 만들어 놓을때 사용됩니다. Comparable이 구현된 클래스들의 기본 정렬 규칙과는 다르게, 주어진 특정 기준을 가지고 정렬 규칙을 지정하고 싶을때 사용합니다.

사용 예제

1. Comparable

Comparable 인터페이스를 implements 하고 compareTo 메소드를 원하는 기준으로 오버라이드 해야합니다.

public class Writer implements Comparable<Writer>{
	int num;
	String name;
	int age;
	String title;
	
	public Writer(int num, String name, int age, String title) {
		super();
		this.num = num;
		this.name = name;
		this.age = age;
		this.title = title;
	}

	@Override
	public String toString() {
		return "Writer [num=" + num + ", name=" + name + ", age=" + age + ", title=" + title + "]";
	}

	@Override
	public int compareTo(Writer other) {
		//오름차순 정렬
		//int result = this.num - other.num; //원래 natural order는 오름차순 정렬. 양수 : 기준이 더 크다. 서로 바꿔줌.
		//내림차순 정렬
		int result =  other.num - this.num;
		return result;
	}
	
}

2. Comparator

Comparator 클래스를 생성하고, compare메소드를 원하는 정렬 기준을 만들어서 사용합니다. Comparator 클래스를 직접 생성하여 관리할수도 있고 익명 클래스, 람다로 사용할수있습니다.

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class WriterTest {

	public static void main(String[] args) {
		ArrayList<Writer> list = new ArrayList<Writer>();
		list.add(new Writer(1, "Kim", 27, "오만과편견"));
		list.add(new Writer(3, "Lee", 24, "R로 시작하는 데이터 분석"));
		list.add(new Writer(7, "Kim", 22, "두잇자바"));
		list.add(new Writer(2, "Park", 22, "이펙티브자바"));
		list.add(new Writer(6, "Jung", 22, "민경채"));
		
		//기본형 데이터만 정렬 가능
		//Arrays.sort();
		Collections.sort(list);//Comparable 타입의 객체여야 함.
//		for (Writer w : list) {
//			System.out.println(w);
//		}
		//Collections.sort(list, (o1,o2) -> o1.name - o2.name);
		//1. 클래스 만들어서 정렬 기준 추가
		Collections.sort(list,  new WriterNameComparator());

		//2. 익명 클래스로 정렬 기준 추가 (나이기준)
		//Comparator를 impl하는 무명 객체
		Collections.sort(list, new Comparator<Writer>() {
			@Override
			public int compare(Writer o1, Writer o2) {
				return o1.age - o2.age;
			}
		});
		
		//3. 람다로 정렬 기준 추가
		Collections.sort(list, (o1,o2) -> {
			int age = o1.age - o2.age;
			if(age==0) {
				return o1.title.compareTo(o2.title);
			}
			return age;
		});
		for (Writer w : list) {
			System.out.println(w);
		}
	}

}