본문 바로가기
Old Posts/Java

[Java] 배열 정렬하기 - Arrays.sort()

by A6K 2021. 4. 24.

자바 프로그래밍을 하면서 데이터들을 정렬할 일이 많다. 자바에서 배열 형태로 저장되어 있는 데이터를 Arrays.sort() 메소드를 제공하고 있어 이 메소드를 이용해 따로 정렬 메소드를 구현하지 않고 데이터를 정렬할 수 있다. Arrays 클래스에는 배열에 대한 복사, 정렬, 검색 등의 유틸리티 메소드들이 구현되어 있다.

배열의 정렬

Arrays.sort() 메소드를 이용해 정렬을 수행하면 기본적으로 오름차순으로 정렬된다. 오름차순이란 작은 값이 앞에 오도록 정렬된 순서를 의미한다.

숫자 배열 정렬

숫자에 대한 정렬을 수행하는 예제는 다음과 같다.

import java.util.Arrays;

public class Example {

    public static void main(String[] args) {

        int[] values = {3, 23, 16, 5, 1, 87, 65};
        System.out.print("Original : ");
        for (int i : values) {
            System.out.print("[" + i + "]");
        }

        Arrays.sort(values);

        System.out.print("\nSorted : ");
        for (int i : values) {
            System.out.print("[" + i + "]");
        }
    }
}

별다른 순서없이 정수 배열에 선언된 숫자들을 Arrays.sort(arr) 메소드를 이용해서 정렬했다. 주의할 점은 기존 배열의 순서를 바꿔버린다는 점이다. 새로 정렬된 상태의 배열 객체를 생성해서 리턴해주는 것이 아니다. (메소드의 내부에 적혀있는 주석을 살펴보면 'Dual-pivot QuickSort'를 사용하고 있음을 알 수 있다.)

int 타입뿐 아니라 float, double, long, short 등 기본 자료형(Primitive Type) 데이터에 대해서 사용할 수 있다.

문자 배열 정렬

Arrays.sort() 메소드는 문자열 데이터에 대해서도 적용할 수 있다.

import java.util.Arrays;

public class Example {

    public static void main(String[] args) {

        String[] values = {"collection", "array", "integer", "float", "double"};
        System.out.print("Original : ");
        for (String i : values) {
            System.out.print("[" + i + "]");
        }

        Arrays.sort(values);

        System.out.print("\nSorted : ");
        for (String i : values) {
            System.out.print("[" + i + "]");
        }
    }
}

문자열 데이터 역시 별다른 구현 없이 Arrays.sort() 메소드를 이용해서 정렬할 수 있다.

객체 배열 정렬

객체를 담고 있는 배열을 정렬하기 위해서 Arrays.sort() 메소드를 사용할 수 있다. 이 때, 객체는 Comparable 인터페이스를 구현한 클래스여야 한다. Arrays.sort() 메소드 내부에서 Comparable 인터페이스의 compareTo() 메소드를 이용해서 객체를 정렬하기 때문이다.

이름과 나이를 이용해서 정렬하는 예제를 하나 생각해보자.

import java.util.Arrays;
import java.util.Collections;

class Person implements Comparable {

    private String name;
    private int age;

    public Person(String name, int age){
        this.name = name;
        this.age= age;
    }

    @Override
    public int compareTo(Object o) {

        // Person이 아닌 객체와 비교할 수 없음
        if (!(o instanceof Person)) {
            throw new IllegalArgumentException("Cannot compare with the object that is not Person");
        }

        Person other = (Person)o;

        if (this.age < other.age) {
            return -1;
        } else if (this.age > other.age) {
            return 1;
        } else {
            return this.name.compareTo(other.name);
        }
    }

    @Override
    public String toString() {
        return "[" + name + "(" + age + ")]";
    }
}

public class Example {
    public static void main(String[] args)  {
        Person[] persons = { new Person("Tom", 15)
            , new Person("Dave", 35)
            , new Person("Mark", 35)
            , new Person("Angel", 15)
            , new Person("Jennifer", 21)
        };

        // 정렬
        Arrays.sort(persons);

        for (Person p : persons) {
            System.out.print(p);
        }

        System.out.println(" ");
    }
}

Person 클래스의 compareTo() 메소드의 구현을 주목하자. 우선 비교가 가능한 클래스인지 먼저 확인해야한다. 그리고 나이 순으로 먼저 정렬한 다음, 같은 나이라면 이름순으로 정렬도록 구현했다.

배열에서 정렬 가능한 객체를 구현하려면 이 예제처럼 Comparable 인터페이스를 구현하면 된다.

배열의 정렬 - 내림차순

Arrays.sort() 메소드를 이용하면 오름차순으로 정렬된다. 별다른 정렬 순서 옵션을 명시하지 않으면 기본값이다. 반대로 내림차순으로 정렬하고 싶은 경우에는 '내림차순으로 정렬해줘'라고 인자를 넘겨주면 된다.

내림차순을 하기위한 인자는 Collections.reverseOrder() 로 넘겨주면 된다. 첫 번째 예제를 내림차순으로 정렬해보자.

import java.util.Arrays;
import java.util.Collections;

public class Example {

    public static void main(String[] args) {

        Integer[] values = {3, 23, 16, 5, 1, 87, 65};
        System.out.print("Original : ");
        for (int i : values) {
            System.out.print("[" + i + "]");
        }

        Arrays.sort(values, Collections.reverseOrder());

        System.out.print("\nSorted : ");
        for (int i : values) {
            System.out.print("[" + i + "]");
        }
    }
}

Collections.reverseOrder() 인자와 함께 int 배열이 Integer 객체 배열로 변환된 것을 확인할 수 있다. 역순 정렬을 위해서는 기본형의 래퍼 클래스(Wrapper Class)를 사용해야한다. (정확히는 Comparable 인터페이스를 구현한 클래스를 사용해야한다)

내림차순은 오름차순의 리버스 정렬이다. 위에서 봤던 것처럼 객체의 정렬을 위해서 compareTo() 메소드를 구현했을 때, 리버스 정렬 옵션을 주면 정렬 조건이 반대로 적용된다.

댓글