기술(Tech, IT)/자바(Java)

[Java] compareTo method, Comparable interface

Daniel803 2022. 10. 27. 07:29

 Java에서 대소 비교 시에 가장 많이 쓰이는 method로 compareTo()와 compare()가 있고, 이 중 compareTo()를 살펴보겠다. compareTo()는 Comparable 인터페이스에 선언됐기 때문에 이를 사용하기 위해선 Comprable 인터페이스를 implements한 다음 Override를 해줘야한다.

 compareTo()와 compare()는 몇 가지 차이점을 보이는데 이 중 하나가 Parameter의 개수다. 두 method 모두 비교를 위해 두 개의 대상이 필요하지만 compareTo()는 하나의 parameter를 compare()는 두 개의 paramter를 받는다.

아래는 Java 내 존재하는 BigInteger와 유사한 기능을 하는 BigNumber라는 class 구현의 일부로, compareTo()를 override한 것이다. method를 override 하는 만큼 정의하기 나름이지만 일반적으로는 argument가 작을 때 양수, 같을 때 0, 클 때 음수를 반환한다(return). 아래 구현엔 구체적인 숫자인 1, 0, -1을 사용했지만 반드시 그런 것은 아니다.

 또한 compareTo()는 sort()를 할 때 참조로 쓰이므로 sort()를 사용하고자 할 때 먼저 override 해야한다.

 override한 compareTo()를 사용하는 방법은 main()에 선언된 것과 같다. 같은 type의 객체를 비교하는 것으로 비교하려는 주체 Instance와 비교 대상이 되는 다른 Instance가 argument로 넘겨진다.

public class BigNumberImpl implements BigNumber, Comparable<BigNumber> {

  @Override
  public int compareTo(BigNumber o) {
    if (this.length() > o.length()) {
      return 1;
    } else if (this.length() < o.length()) {
      return -1;
    } else {
      for (int i = this.length() - 1; i >= 0; i--) {
        if (this.getDigitAt(i) > o.getDigitAt(i)) {
          return 1;
        } else if (this.getDigitAt(i) < o.getDigitAt(i)) {
          return -1;
        }
      }
      return 0;
    }
  }
}
public class Main {
  public static void main(String[] args) {
    BigNumberImpl b1 = new BigNumberImpl("7133");
    BigNumberImpl b2 = new BigNumberImpl("226065");

    System.out.println(b1.compareTo(b2));
  }
}

실행 결과:

-1

 

argument가 작을 시 -1을 return하도록 method를 작성했고, 기대한 결과가 나오는 것을 확인할 수 있다.