Java Category/Java

[Java] Arrays.sort(), Collections.sort() Comparator, Comparable

ReBugs 2024. 1. 15.

Arrays.sort()와 Collections.sort()

Arrays.sort()와 Collections.sort()는 Java에서 배열과 컬렉션을 정렬하는 메서드이다.

Arrays.sort()

  • Arrays 클래스에 속한 정적 메서드로, 배열을 정렬할 때 사용한다.
  • 주로 기본 타입 배열(int, double)을 정렬하는 데 사용된다.
  • 정렬 알고리즘으로는 기본적으로 퀵 소트(QuickSort)가 사용되지만, Java 7 이후로는 퀵 소트와 병합 소트(MergeSort)가 혼합된 팀소트(TimSort)가 사용된다.
  • Arrays.sort()는 인자로 넘겨받은 배열을 직접 수정하며, 반환값은 void이다.
int[] arr = {5, 2, 9, 1, 5};
Arrays.sort(arr);

 

Collections.sort()

  • Collections 클래스에 속한 정적 메서드로, 리스트나 컬렉션 객체를 정렬할 때 사용한다.
  • 주로 객체 기반의 리스트(List<Integer>, List<String> 등)를 정렬하는 데 사용된다.
  • 정렬 알고리즘으로는 병합 소트(MergeSort)가 사용된다.
  • Collections.sort()는 인자로 넘겨받은 리스트를 직접 수정하며, 반환값은 void이다.
List<Integer> list = Arrays.asList(5, 2, 9, 1, 5);
Collections.sort(list);

 

두 메서드는 모두 정렬을 위해 객체의 비교를 위해 compareTo 또는 compare 메서드를 사용한다.

따라서 정렬하려는 객체가 Comparable 인터페이스를 구현하거나, 비교자(Comparator)를 제공해야 한다.

또한, Arrays.sort()와 Collections.sort()는 오름차순 정렬을 기본으로 수행한다.

만약 내림차순으로 정렬하려면, Collections.reverseOrder()나 비교자(Comparator)를 사용하여 정렬해야 한다.

Collections.reverseOrder를 사용하려면 객체 타입으로 선언되어야 한다.

따라서 Arrays.sort()를 사용할 때 아래와 같은 점을 조심해야 한다.

  • int, doubble 과 같은 자료형은 primitive type(원시 자료형)으로 내림차순으로 정렬되지 않는다.
  • 그래서 int형으로 배열을 선언하는 것이 아닌 Integer형으로 배열을 선언한다면 내림차순 정렬도 가능하게 된다.

 

Comparator와 Comparable

Comparable은 주로 클래스 자체에 정렬 기준을 포함할 때 사용되며, Comparator는 외부에서 정렬 기준을 제공할 때 사용된다.

때에 따라 둘을 함께 사용하여 다양한 정렬 기능을 구현할 수 있다.

Comparator

Comparator는 Java에서 객체들의 정렬(ordering)을 제어하기 위한 인터페이스이다.

Comparator는 두 객체를 비교하는 데 사용되며, 정렬 순서를 지정할 수 있도록 도와준다.

이 인터페이스를 구현한 클래스는 compare 메서드를 제공해야 한다.

compare 메서드의 일반적인 형태는 다음과 같다

int compare(T obj1, T obj2);

여기서 T는 비교하려는 객체의 유형을 나타낸다.

compare 메서드는 세 가지 경우를 반환할 수 있다:

  • obj1이 obj2보다 작으면 음수(음의 정수)를 반환한다.
  • obj1이 obj2와 같으면 0을 반환한다.
  • obj1이 obj2보다 크면 양수(양의 정수)를 반환한다.

이러한 반환 값들을 통해 정렬 알고리즘은 정렬 순서를 결정한다.

 

Comparator 인터페이스의 예시를 살펴보자면, 아래는 문자열 길이를 기준으로 정렬하는 StringLengthComparator 클래스이다.

즉, StringLengthComparator는 Comparator의 구현 클래스이다.

import java.util.Comparator;

public class StringLengthComparator implements Comparator<String> {
    @Override
    public int compare(String str1, String str2) {
        return Integer.compare(str1.length(), str2.length());
    }
}

 

Comparator를 사용하여 문자열의 길이에 따라 정렬을 수행할 수 있다.

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

public class Example {
    public static void main(String[] args)
    {
        List<String> strings = Arrays.asList("apple", "banana", "orange", "kiwi");

        // 문자열 길이에 따라 정렬
        Collections.sort(strings, new StringLengthComparator());

        // 정렬된 결과 출력
        for (String str : strings) {
            System.out.println(str);
        }
    }
}
/*
kiwi
apple
banana
orange
*/

 

Comparable

Comparable 인터페이스는 Java에서 객체의 자연 순서를 정의하기 위해 사용되는 인터페이스이다.

이를 구현하는 클래스들은 해당 클래스의 객체를 서로 비교하여 정렬할 수 있는 능력을 가진다.

Comparable은 한 가지 비교 기준을 정의하며, 이것이 해당 클래스의 "자연 순서"가 된다.

자연 순서(natural order)
Comparable 인터페이스를 구현한 클래스들은 이러한 기본 순서를 "자연 순서(natural order)"라고 한다.
예를 들어, 문자열의 경우, 자연 순서는 사전 순서이다.
즉, "apple"은 "banana"보다 작은 값을 가지는 것이 자연 순서에 따른 정렬이다.

 

Comparable 인터페이스는 다음과 같이 선언되어 있다

public interface Comparable<T> {
    int compareTo(T o);
}

여기서 T는 비교하려는 객체의 타입을 나타낸.

compareTo 메서드는 다른 객체와 비교하여 정렬 순서를 나타내는 정수를 반환한다.

반환값에 따라 정렬이 이루어진다.

  • 음수: 현재 객체가 다른 객체보다 작음을 나타냄
  • 0: 현재 객체가 다른 객체와 같음을 나타냄
  • 양수: 현재 객체가 다른 객체보다 큼을 나타냄

예를 들어, Integer 클래스는 Comparable을 구현하고 있어서 다음과 같이 사용할 수 있다.

Integer num1 = 5;
Integer num2 = 10;

int result = num1.compareTo(num2);

if (result < 0) System.out.println("num1 is less than num2");
else if (result == 0) System.out.println("num1 is equal to num2");
else System.out.println("num1 is greater than num2");

클래스에서 Comparable을 구현하면, 해당 클래스의 객체는 자연 순서에 따라 정렬될 수 있다.

예를 들어, 배열을 정렬하는 경우 Arrays.sort() 메서드가 Comparable을 사용하여 정렬한다

Integer[] numbers = {5, 2, 8, 1, 3};
Arrays.sort(numbers);

위의 코드에서 Arrays.sort(numbers)Comparable을 이용하여 numbers 배열을 자연 순서에 따라 정렬한다.

 

compareTo

compareTo 메서드는 Comparable 인터페이스를 구현한 클래스에서 사용되는 메서드로, 두 객체를 비교하여 정렬 순서를 결정하는 데 사용된다.

compareTo 메서드는 일반적으로 다음과 같은 형태를 가지고 있다.

int compareTo(T other);

여기서 T는 비교하려는 객체의 타입을 나타내며, other는 비교 대상 객체이다.

compareTo 메서드는 비교 결과에 따라 세 가지 경우를 반환한다.

  • this 객체가 other 객체보다 작으면 음수(음의 정수)를 반환.
  • this 객체와 other 객체가 같으면 0을 반환.
  • this 객체가 other 객체보다 크면 양수(양의 정수)를 반환.

이렇게 반환된 값을 기반으로 정렬 알고리즘은 객체들을 정렬한다.

Comparable 인터페이스를 구현한 클래스는 해당 클래스의 객체를 자연 순서(natural order)에 따라 정렬할 수 있게 된다.

예를 들어, String 클래스는 Comparable 인터페이스를 구현하고 있어서 compareTo 메서드를 제공한다.

문자열의 경우, 사전 순서로 비교가 이루어진다

String str1 = "apple";
String str2 = "banana";

int result = str1.compareTo(str2);
System.out.println(result);  // 결과는 음수(-1)이 나옴

이 경우, "apple"은 "banana"보다 사전 순서상으로 작기 때문에 음수가 반환된다.

마찬가지로, 정수형 데이터 타입인 Integer, Double 등도 Comparable 인터페이스를 구현하고 있어서 compareTo 메서드를 사용하여 비교할 수 있다.

'Java Category > Java' 카테고리의 다른 글

[Java] Optional<T>  (1) 2024.03.15
[Java] static import  (0) 2024.01.23
[Java] char 타입을 정수 타입으로 변환  (3) 2023.11.26
[Java] next()와 nextLine()의 차이  (0) 2023.08.22
[Java] DB와 연동한 게시판 구현  (0) 2023.08.21

댓글