자바 - Comparable

Jake·2023년 7월 6일

코딩테스트에서 필요하다고 생각되는 이론 중 정렬 관련하여 comparable에 대해서 알아보겠습니다

데이터를 정렬할때 사용되는 방법은

Sort 와 Comparable

이 있습니다

Sort는 단일기준
Comparable은 정렬기준이 여러개

각각 사용됩니다

comparable

Java에서 Comparable은 인터페이스로, 객체들 간의 순서를 정의하기 위해 사용됩니다. Comparable 인터페이스를 구현한 클래스는 "비교 가능"하다고 할 수 있으며, 해당 클래스의 객체들은 서로 비교할 수 있고 정렬할 수 있습니다.

Comparable 인터페이스는 단일 메서드인 compareTo()를 정의합니다. 이 메서드는 비교 대상 객체와 비교하여 현재 객체가 작은지, 같은지, 또는 큰지를 나타내는 값을 반환합니다. compareTo() 메서드의 반환 값에 따라 객체들은 정렬될 수 있습니다.

compareTo() 메서드의 구현은 일반적으로 다음 규칙에 따라 이루어집니다:

  • 현재 객체가 비교 대상 객체보다 작으면 음수 값을 반환합니다.
  • 현재 객체가 비교 대상 객체와 같으면 0을 반환합니다.
  • 현재 객체가 비교 대상 객체보다 크면 양수 값을 반환합니다.

Comparable 인터페이스를 구현한 클래스의 객체들은 Arrays.sort()와 Collections.sort()와 같은 정렬 메서드를 사용하여 정렬할 수 있습니다. 이러한 정렬 메서드는 compareTo() 메서드를 활용하여 객체들을 정렬합니다.

예시로 영어점수가 높은 순으로 정렬, 영어점수가 동일할 경우 수학점수가 높은 점수로 정렬에 대해 구현해보도록 하겠습니다

Score 클래스의 멤버 변수로 eng와 math가 있다고 가정해보겠습니다

여기서 해당 Score 클래스에 Comparable 를 상속하여 줍니다

그리고 compareTo를 아래와 같이 구현하면 Collections.sort()로 구현한 정렬을 사용할 수 있습니다

public class Score implements Comparable<Score> {
    private int eng;
    private int math;

    // 생성자, getter, setter 등 생략

    @Override
    public int compareTo(Score other) {
        // 영어 점수 비교
        int engComparison = Integer.compare(other.eng, this.eng);
        if (engComparison != 0) {
            return engComparison; // 영어 점수가 높은 순으로 정렬
        }

        // 영어 점수가 동일한 경우 수학 점수 비교
        return Integer.compare(other.math, this.math); // 수학 점수가 높은 순으로 정렬
    }
}

compareTo에서는 리턴값이 양수인지, 음수인지가 중요합니다

만약 매개변수 데이터가 더 클때 해당 변수 기준 내림차순으로 정렬이 되며
더 작을때는 해당 변수 기준 오름차순으로 정렬이 됩니다

만약 정렬 방향을 바꾸고 싶다면 데이터의 위치를 변경함으로써 바꿀 수 있습니다

Integer.compare

위 코드에서 Integer.compare 함수를 사용하였습니다 이 compare 함수에 대해 대해 간단히 살펴보겠습니다

Integer.compare()는 두 개의 int 값을 비교하는 정적 메서드입니다. 이 메서드는 두 정수를 비교하고 결과를 반환합니다. 반환 값은 다음과 같습니다:

  • 음수 값: 첫 번째 정수가 두 번째 정수보다 작은 경우
  • 0: 두 정수가 같은 경우
  • 양수 값: 첫 번째 정수가 두 번째 정수보다 큰 경우

Integer.compare() 메서드를 사용하여 두 정수를 비교하는 예시는 다음과 같습니다:

int result = Integer.compare(a, b);
if (result < 0) {
    System.out.println("a is less than b");
} else if (result == 0) {
    System.out.println("a is equal to b");
} else {
    System.out.println("a is greater than b");
}

위의 코드에서 ab는 비교할 두 정수입니다. Integer.compare(a, b)를 호출하여 ab를 비교한 후, 반환된 결과를 사용하여 비교 결과를 출력합니다.

Integer.compare() 메서드를 사용하면 간편하게 두 정수를 비교하고 비교 결과에 따라 조건문 등을 사용하여 원하는 동작을 수행할 수 있습니다.

0개의 댓글