Comparable, Comparator

민선규·2023년 3월 20일
0

JAVA

목록 보기
4/25
post-thumbnail

Comparable, Comparator란

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;
    }

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

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;
        }
		return this.age - o.age;
	}

이처럼 명시적으로 적어주는 것이 좋다.

Comparable, Comparator를 공부하면서 사용하는 데에 편의를 늘릴 수 있는 방법으로 익명 객체를 활용하는 방법이 있다는 것을 알게 되었다. 다음에는 익명 객체에 대해 정리를 해볼 계획이다.

참고 문서 및 링크

0개의 댓글

관련 채용 정보