언어/Java

[Java]Comparable과 Comparator의 이해

GAEBAL 2022. 2. 18. 23:17
728x90

Comparable과 Comparator

일단 둘 다 인터페이스(interface)임.

즉, Comparable 혹은 Comparator을 사용하고자 한다면 인터페이스 내에 선언된 메서드를 '반드시 구현' 해야함.

 

Comparable 공식 문서

Comparable (Java Platform SE 8 )

공식 API 문서임. Comparable을 보면 Comparable 인터페이스에는 compareTo(T o) 메서드 하나가 선언되어있는 것을 볼 수 있는데, 이 말은 만약 Comparable을 사용하고자 한다면 compareTo 메서드를 재정의(Override/구현)을 해주어야 한다는 것임.

 

Comparator 공식 문서

Comparator (Java Platform SE 8 )

Comparator는 보면 선언 된 메서드가 많지만, 실질적으로 구현해야 하는 것은 단 하나 → compare(T o1, T o2) 다.

얘네 둘은 보통 많은 사람들이 ‘객체를 정렬하기 위해 쓴다’고 하지만, 정확히 말하면 그건 용도에 불과함.

 

💡 “객체를 비교할 수 있도록 만든다.”

이거임!!!

 

primitive 타입의 8개의 타입(기본 자료형)은 자바 자체에서 제공되기에 별다른 처리없이 부등호를 가지고 쉽게 두 변수를 비교할 수 있지만, 예를 들어 String 타입의 경우는 그렇지 않다.

예를 들어서,

public class Test {
	public static void main(String[] args)  {
		Student a = new Student(17, 2);	// 17살 2반
		Student b = new Student(18, 1);	// 18살 1반

		/*
		   어떻게 비교..?
		   
		   if(a > b) ..?
		 */
	}
}
 
class Student {
	int age;			// 나이
	int classNumber;	// 학급
	
	Student(int age, int classNumber) {
		this.age = age;
		this.classNumber = classNumber;
	}
}

이런 경우에는 나이로 비교를 해야할지, 학급으로 비교를 해야할지 기준을 정해야 함. → 이런 문제점을 해결하기 위한 것이 Comparable과 Comparator!!!!! 객체를 비교하게 해준다!!!!!

 

Comparable과 Comparator의 차이점

왜 Comparable의 compareTo(T o) 메서드는 파라미터(매개변수)가 한 개이고, Comparator의 compare(T o1, T o2) 메서드는 파라미터가 왜 두 개인 것일까?

 

💡 Comparable은 "자기 자신과 매개변수 객체를 비교"하는 것이고, Comparator는 "두 매개변수 객체를 비교"하기 때문!!!

 

Comparable은 자기 자신과 파라미터로 들어오는 객체를 비교하는 것이고, Comparator는 자기 자신의 상태가 어떻든 상관없이 파라미터로 들어오는 두 객체를 비교하는 것이다. 즉, 본질적으로 비교한다는 것 자체는 같지만, 비교 대상이 다르다!!

 

또 다른 차이점이라면 Comparable은 lang패키지에 있기 때문에 import 를 해줄 필요가 없지만, Comparator는 util패키지에 있다는 것

728x90