객체 정렬이란?

객체는 사용자가 정의한 타입으로, 사용자가 원하는 임의의 정렬 기준에 맞춰 객체를 정렬할 수도 있다. 예를 들어, 성적을 나타내는 Grade 클래스가 있다고 해보자. 국어점수는 증가하는 순으로, 수학점수는 감소하는 순으로 정렬하고자 할 때 Grade 타입의 객체들을 임의의 기준으로 정렬하게 된다.

객체 정렬 기준을 지정하는 2가지 방법

1️⃣ Comparable [java.lang.Comparable]

정렬 수행 시 기본적으로 적용되는 정렬 기준이 되는 메서드를 정의하는 인터페이스

→ Java의 모든 정렬 가능한 클래스들은 모두 Comparable 인터페이스를 구현하며, 정렬 시에 이에 맞게 정렬이 수행된다.

구현 방법 : 정렬할 객체에 Comparable interface를 implements 후, compareTo() 메서드 오버라이딩

  • 현재 객체 < 파라미터 객체 : 음수
  • 현재 객체 == 파라미터 객체 : 0
  • 현재 객체 > 파라미터 객체 : 양수

*음수 또는 0을 리턴하는 경우 객체의 자리가 그대로 유지되며, 양수의 경우 두 객체의 자리가 바뀐다.

사용 방법

  • Arrays.sort(array) 배열 정렬 → byte[], char[], int[], Object[], T[] 등
    *Object 타입의 배열은 새로 정의한 클래스에 대한 배열로, Timsort(삽입정렬+병합정렬)를 사용하고, Primitive 타입의 배열은 기본 자료형에 대한 배열로, Dual Pivot Quicksort(퀵정렬+삽입정렬)를 사용한다.
  • Collections.sort(list) List Collection 정렬 → ArrayList, LinkedList, Vector 등
    *내부적으로 Arrays.sort()를 사용한다.
class Point implements Comparable<Point> {
    int x;
    int y;

    Point(int x, int y) {
        this.x = x;
        this.y = y;
    }

    @Override
    public int compareTo(Point p) {
        if (this.x > p.x) {    // x좌표 오름차순 정렬
            return 1;
        } else if (this.x == p.x) {
            if (this.y > p.y) {   // x좌표가 같은 경우, y좌표 오름차순 정렬
                return 1;
            }
        }
        return -1;
    }
}

// main에서 사용 시
List<Point> pointList = new ArrayList<>();
pointList.add(new Point(x, y));
Collections.sort(pointList);

Point[] pointArr = new Point[N];
pointArr[i] = new Point(x, y);
Array.sort(pointArr);

2️⃣ Comparator [java.util.Comparator]

정렬 가능한 클래스들의 기본 정렬 기준과 다르게 정렬하고자 할 때 사용하는 인터페이스

→ 주로 익명 클래스로 사용되며, 오름차순을 내림차순으로 정렬할 때 많이 사용한다.

구현 방법 : Comparator interface를 implements 후, compare() 메서드를 오버라이e드한 myComparator class 작성

*compare()의 리턴값은 Comparable 인터페이스의 compareTo() 와 동일하며, Integer.compare(x, y)return (x < y) ? -1 : ((x == y) ? 0 : 1); - 오름차순 정렬 과 동일한 개념

*내림차순 정렬의 경우, 두 파라미터 위치를 바꾸어 Integer.compare(y, x) 와 같이 작성한다.

**사용 방법 : Arrays.sort(array, myComparator), Collections.sort(list, myComparator)**

*Comparable의 사용법과 다른 점은 정렬 함수의 두 번째 인자로 Comparator interface를 받을 수 있다는 점이다.

ex. 우선순위 큐 생성자의 두 번째 인자로 Comparator interface를 받을 수 있다.

PriorityQueue(int initialCapacity, Comparator<? super E> comparator);

// Comparator 익명 클래스 사용
Comparator<Grade> myComparator = new Comparator<Grade>() {
		@Override
		public int compare(Grade g1, Grade g2) {

		}
};

List<Grade> gradeList = new ArrayList<>();
gradeList.add(new Grade(kor, math));
Collections.sort(gradeList);

Grade[] gradeArr = new Grade[N];
gradeArr[i] = new Grade(kor, math);
Array.sort(gradeArr);

참고

https://gmlwjd9405.github.io/2018/09/06/java-comparable-and-comparator.html

https://st-lab.tistory.com/243

profile
서버 개발자를 꿈꾸며 성장하는 쭌입니다 😽

0개의 댓글

관련 채용 정보

Powered by GraphCDN, the GraphQL CDN