Comparable, Comparator를 이용한 객체 정렬

1 분 소요

객체 지향 언어인 자바를 사용할 때는 클래스, 인스턴스와 같은 객체의 개념으로 접근을 한다. 최근 공부를 하면서 객체들의 대한 정렬을 하는 방법을 찾아보게 되면서 여러 클래스들에 대해 알게되었다. 따라서 이를 정리해보려고 한다.


Primitive 데이터의 정렬

기본적으로 데이터를 다루다보면 정렬을 필요로 할 때가 많은데, 이때 자바에서는 원시형 데이터에 대한 정렬을 함수로 제공하고 있어 쉽게 적용이 가능하다. 그 이유는 기본적인 통념으로서 대소관계가 성립되기 때문이다.

import java.util.Arrays;

int[] numbers = { 3, 1, 5, 4, 2 };
Arrays.sort(numbers); // [1, 2, 3, 4, 5]

그러나 자신만의 클래스를 만들고 해당 클래스에 인스턴스를 여러 개 생성하게 되면, 기존의 정렬 방법으로는 정렬이 불가능하다. 그 이유는 앞서 말했던 객체 정렬에 대한 기본적인 통념이 존재하지 않기 때문이다. 따라서 이러한 객체 데이터들을 정렬하기 위해선 객체의 정렬 기준이 요구된다.

Comparable Interface

자바에서 제공하는 Comparable 인터페이스를 이용하여 정렬 기준을 정할 수 있다.

public class Student implements Comparable<Student> {
    
    ... 생략 ...

    @Override
    public int compareTo(Student s) {
        return s.getScore() - this.getScore();
    }    
}

이때 원하는 정렬 기준에 따라 int 형으로 값을 리턴해주어야 한다.

  1. 해당 객체가 매개변수의 객체보다 큰 경우 // 0보다 큼(양수)
  2. 해당 객체가 매개변수의 객체보다 작은 경우 // 0보다 작음(음수)
  3. 해당 객체와 매개변수의 객체가 같은 경우 // 0

두 객체의 대소 관계는 사용자가 원하는 정렬 방식에 따라 나누어지므로 예를 들어 오름차순 정렬을 원한다면 실제 객체의 값과 다르게 결과 값을 음수로 리턴해주면 된다.

import java.util.Collections

Collections.sort(students) // ArrayList<Student> students

Collections 클래스를 통해 정렬을 할 수 있다. 이때 Student 클래스가 Comparable 함을 만족하므로 명시한 기준으로 정렬이 수행된다.

Comparator Class

두번째 방법은 정렬을 원하는 객체의 클래스를 수정하지 않아도 가능한 방법으로 Collections.sort() 에서 요구하는 정렬 함수를 Comparator 클래스로 구현하여 직접 매개변수로 전달하는 것이다.

import java.util.Comparator;

Collections.sort(students, new Comparator<Student>() {
    public int compare(Student s1, Student s2) {
        return s2.getScore() - s1.getScore();
    }
});

// Lambda Expression

Collections.sort(students, (s1, s2) -> s2.getScore() - s1.getScore());

이와 같이 Comparable, Comparator 모두 객체를 정렬함에 있어서 아주 유용하게 사용할 수 있다.

태그: ,

카테고리:

업데이트:

댓글남기기