본문 바로가기
BackEnd/Java

[Java] java.util.comparator, java.util.comparable

by summer_light 2022. 3. 16.

Comparable & Comparator

원래 비교할 수 없는 객체들끼리의 비교를 가능하게 해 주는 인터페이스입니다.

둘 다 인터페이스이기 때문에,

Comparable, Comparator 를 사용하려면 인터페이스 내에 선언된 메소드를 반드시 먼저 구현해야 합니다.

 

즉,

 

Comparable 인터페이스에는 compareTo(T o) 메소드가 선언되어 있으므로,

CompareTo 메소드를 구현(재정의=오버라이드)해야 하고

 

Comparator 인터페이스에는 compare(T o1, To2) 메소드를 선언되어 있으므로,

Comparator 메소드를 구현해야 합니다.

 

 

 

Comparable

Comprable은 자기 자신과 매개변수 객체를 비교하고자 할 때 사용합니다.

따라서 다음과 같이 작성하게 됩니다.

class 클래스A implements Comparable<클래스A>  {

	public int compareTo(클래스A o) {
    
    	// 자기자신>o : 양수
    	if( ... ) {
        	return 1;
    	}
    
        // 자기자신=o : 0
        if( ... ) {
            return 0;
        }

        // 자기자신<0 : 음수
        if( ... ) {
            return -1;
        }
    }
}

 

조금 더 간단히 표현하고자 한다면 다음과 같이 작성할 수도 있습니다. 

class 클래스A implements Comparable<클래스A>  {

	public int compareTo(클래스A o) {
    
    	//사실, 양수/0/음수 로 구분되기 때문에 
        //다음과 같이 자기자신-o 의 값을 return 하는 방법도 가능하다.
        
        return this.변수이름 - o.변수이름; 
        
        //단, underflow와 overflow로 인해 비교 결과가 반대로 나오는 경우를 주의해야한다. 
        
    }
}

 

 

 

Comparator

이에 비해 Comparator는 자기 자신과는 상관없이 입력된 두 객체(o1, o2)와의 비교를 수행합니다.

class 클래스A implements Comparator<클래스A>  {

	public int compare(클래스A o1, 클래스A o2) {
    
    	// o1>o2 : 양수
    	if( ... ) {
        	return 1;
    	}
    
        // o1=o2 : 0
        if( ... ) {
            return 0;
        }

        // o1<o2 : 음수
        if( ... ) {
            return -1;
        }
    }
}

 

물론 아까와 같은 방식으로 간단히 작성할 수도 있습니다. 

class 클래스A implements Compartor<클래스A>  {

	public int compare(클래스A o1, 클래스A o2) {
     
        //아까와 같이 o1-o2 의 값을 return 하는 방법도 가능하다.
        
        return o1.변수이름 - o2.변수이름; 
        
        //underflow와 overflow로 인해 비교 결과가 반대로 나오는 경우는 여전히 주의해야한다. 
        
    }
}

 

하지만 Comparator가 자기 자신과는 상관 없이 입력된 값 두 가지 사이의 비교를 한 다는 점 때문에,

복잡한 코드에서는 이 부분이 꽤 헷갈릴 수 있습니다.

 

그래서 보통 다음과 같이 comp와 같은 익명 객체를 이용하여 재정의를 하는 경우가 많습니다. 

 

public static Comparator<클래스A> comp = new Comparatir<클래스A>() {

	@Override
    public int compare(클래스A o1, 클래스A o2) {
    	return o1.변수이름 - o2.변수이름;
    }

}

 

 

댓글