프로그래밍 언어/Java

Comparable, Comparator

Stitchhhh 2025. 2. 16. 18:23

등장 배경

primitive type은 Java에서 변수를 비교할 수 있는 기능을 제공해 주지만 새로운 클래스 객체를 만들어 비교하고자 할 때 객체는 사용자가 기준을 정해주지 않는 이상 어떤 객체가 더 높은 우선순위를 갖는지 판단 할 수가 없습니다. 이를 해결하기 위한 인터페이스가 Comparable과 Comparator입니다.

//primitive type 비교
public static void main(String[] args)  {
	int a = 1;
	int b = 2;
		
	if(a > b) {
		System.out.println("a가 b보다 큽니다.");
	}
	else if(a == b) {
		System.out.println("a와 b는 같습니다.");
	}
	else {
		System.out.println("b가 a보다 큽니다. ");
	}
}
//클래스 객체 비교
public static void main(String[] args)  {
	Person p1 = new Person();
	Person p2 = new Person();

	//이름 순 일까? 나이 순 일까?
	if(p1 > p2) {
		System.out.println("a가 b보다 큽니다.");
	}
	else if(p1 == p2) {
		System.out.println("a와 b는 같습니다.");
	}
	else {
		System.out.println("b가 a보다 큽니다. ");
	}
}
    
class Person{
	int age;
	String name;
}

 

Comparable와 Comparator 차이

두 인터페이스는 비교를 위한 기준을 정하는 데에 사용한다는 점을 알게되었습니다. 다음으로는 하나의 인터페이스가 아닌 두 종류의 인터페이스를 지원하는 이유를 정리해보겠습니다.

 

Comparable 인터페이스를 살펴보면 실제 구현해야 하는 함수는 compareTo(T o)이고, Comparator 인터페이스는 compare(T o1, T o2)입니다. 구현해야 하는 함수에 파라미터의 개수에서 차이가 나는데 그 이유는 Comparable은 자기 자신과 파라미터로 들어오는 객체를 비교하는 것이고, Comparator은 파라미터로 들어오는 두 개의 객체를 서로 비교하는 역할을 하기 때문입니다.

Comparator 적용

public static void main(String[] args)  {
	Person p1 = new Person();
	Person p2 = new Person();
        
	int result = p1.compare(p1,p2);
		
	//나이 순
	if(result > 1) {
		System.out.println("p1이 p2보다 큽니다.");
	}
	else if(result == 0) {
		System.out.println("p1와 p2는 같습니다.");
	}
	else {
		System.out.println("p2가 p1보다 큽니다. ");
	}
}
    
class Person implements Comparator<Student> {
	int age;
	String name;
		
	@Override
	public int compare(Person o1, Person o2) {
		/*
 		* 만약 o1의 age o2의 age 크다면 양수가 반환 될 것이고,
 		* 같다면 0을, 작다면 음수를 반환할 것이다.
 		*/
		return o1.age - o2.age;
	}
}

 

Comparable 적용

	
public static void main(String[] args)  {
	Person p1 = new Person();
	Person p2 = new Person();
        
	int result = p1.compareTo(p2);
		
	//나이 순
	if(result > 1) {
		System.out.println("p1이 p2보다 큽니다.");
	}
	else if(result == 0) {
		System.out.println("p1와 p2는 같습니다.");
	}
	else {
		System.out.println("p2가 p1보다 큽니다. ");
	}
}
    
class Person implements Comparable<Person> {
	int age;
	String name;
		
	@Override
	public int compareTo(Person o) {
		/*
 		* 만약 자신의 age가 o의 age보다 크다면 양수가 반환 될 것이고,
 		* 같다면 0을, 작다면 음수를 반환할 것이다.
 		*/
		return this.age - o.age;
	}
}

 

compareTo, compare 주의할 점

위에 구현 부 에서는 o1.age - o2.age, this.age - o.age 을 리턴하도록 되어 있는데 오버플로우와 언더플로우를 항상 조심을 해야 합니다. 정렬의 기준이 음수, 0, 양수이기 때문에 위 코드는 단순 로직으로 구현을 하였고, 이처럼 명시적으로 적어주는 것이 좋습니다.

@Override
public int compareTo(Person o) {
	if(this.age > o.age){
		return 1;
	}
	else if(this.age == o.age){
		return 0;
	}
	else{
		return -1;
	}
}

'프로그래밍 언어 > Java' 카테고리의 다른 글

equals()  (0) 2025.02.16
System.out.print  (0) 2025.02.16
동기&비동기, 블로킹&논블로킹  (0) 2025.02.16
Garbage Collection(GC)  (0) 2025.02.16
Optional 개념 및 사용법  (2) 2025.02.16