Back_End/JAVA

자바(JAVA) Arrays.sort() vs Collections.sort()

10Biliion 2025. 3. 11. 16:45

 

1. Arrays.sort()

  • 대상: int[], double[], String[] 같은 기본 배열과 Object[] 배열
  • 내부 구현:
    • 기본형 배열(int[], double[] 등): Dual-Pivot Quicksort (최적화된 퀵 정렬)
    • 객체 배열(Object[]): Timsort (합병 정렬과 삽입 정렬의 조합)
  • 특징:
    • Comparable을 구현한 객체 배열 정렬 가능
    • Comparator를 사용할 수도 있음
    • 기본형 배열은 Comparator를 사용할 수 없음

📌 예제 1: 기본형 배열 정렬

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        int[] numbers = {5, 3, 8, 1, 2};
        Arrays.sort(numbers); // 오름차순 정렬
        System.out.println(Arrays.toString(numbers)); // [1, 2, 3, 5, 8]
    }
}

Arrays.sort()는 기본형 배열을 정렬할 때 Dual-Pivot Quicksort를 사용합니다.


📌 예제 2: 객체 배열 정렬 (Comparable 사용)

import java.util.Arrays;

class Person implements Comparable<Person> {
    String name;
    int age;

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

    @Override
    public int compareTo(Person o) {
        return Integer.compare(this.age, o.age); // 나이 오름차순 정렬
    }

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

public class Main {
    public static void main(String[] args) {
        Person[] people = {
            new Person("Alice", 30),
            new Person("Bob", 25),
            new Person("Charlie", 35)
        };

        Arrays.sort(people); // 나이 기준 오름차순 정렬
        System.out.println(Arrays.toString(people));
        // 출력: [Bob(25), Alice(30), Charlie(35)]
    }
}

Arrays.sort()는 객체 배열을 정렬할 때 Timsort를 사용합니다.


📌 예제 3: 객체 배열 정렬 (Comparator 사용)

import java.util.Arrays;
import java.util.Comparator;

public class Main {
    public static void main(String[] args) {
        String[] words = {"banana", "apple", "cherry", "date"};
        
        // 문자열 길이 기준 정렬
        Arrays.sort(words, Comparator.comparingInt(String::length));
        System.out.println(Arrays.toString(words)); // ["date", "apple", "banana", "cherry"]
    }
}

Comparator를 사용하면 Comparable이 없어도 정렬 가능.


2. Collections.sort()

  • 대상: List<T> (ArrayList, LinkedList 등)
  • 내부 구현:
    • Timsort 알고리즘 사용 (합병 정렬과 삽입 정렬 조합)
  • 특징:
    • Comparable을 구현한 객체를 정렬 가능
    • Comparator를 이용해 사용자 정의 정렬 가능

📌 예제 4: 리스트 정렬 (Comparable 사용)

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Integer> numbers = new ArrayList<>();
        numbers.add(5);
        numbers.add(1);
        numbers.add(8);
        numbers.add(3);

        Collections.sort(numbers); // 오름차순 정렬
        System.out.println(numbers); // [1, 3, 5, 8]
    }
}

Collections.sort()는 내부적으로 List를 Array로 변환한 후 Arrays.sort()를 호출합니다.


📌 예제 5: 리스트 정렬 (Comparator 사용)

import java.util.*;

class Product {
    String name;
    int price;

    public Product(String name, int price) {
        this.name = name;
        this.price = price;
    }

    @Override
    public String toString() {
        return name + "($" + price + ")";
    }
}

public class Main {
    public static void main(String[] args) {
        List<Product> products = new ArrayList<>();
        products.add(new Product("Laptop", 1200));
        products.add(new Product("Phone", 800));
        products.add(new Product("Tablet", 600));

        // 가격 기준 오름차순 정렬
        Collections.sort(products, Comparator.comparingInt(p -> p.price));
        System.out.println(products);
        // 출력: [Tablet($600), Phone($800), Laptop($1200)]
    }
}

Comparator.comparingInt(p -> p.price)를 사용해 가격 기준으로 정렬.


3. Arrays.sort() vs Collections.sort() 차이점 정리

 

  Arrays.sort() Collections.sort()
대상 배열 (int[], String[], Object[] 등) List<T> (ArrayList, LinkedList 등)
기본 정렬 방식 Dual-Pivot Quicksort (기본형) / Timsort (객체) Timsort
Comparable 사용 가능 O O
Comparator 사용 가능 객체 배열만 가능 (Object[]) O
성능 O(N log N) O(N log N)

🚀 어떤 걸 사용해야 할까?

  • 배열을 정렬할 때 → Arrays.sort()
  • 리스트를 정렬할 때 → Collections.sort()
  • 객체 정렬이 필요할 때
    • 배열이면 Arrays.sort()
    • 리스트면 Collections.sort()
  • 기본형 배열을 정렬할 때 → Arrays.sort() (훨씬 빠름, Comparator 사용 불가)

4. List.sort() (Java 8 이후)

  • Collections.sort(list)는 내부적으로 list.sort(Comparator)를 호출하므로 Java 8 이후에는 list.sort()를 직접 사용하는 것이 더 효율적.
import java.util.*;

public class Main {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Bob", "Alice", "Charlie");

        names.sort(Comparator.naturalOrder()); // 오름차순 정렬
        System.out.println(names); // [Alice, Bob, Charlie]
    }
}

List.sort()가 Collections.sort()보다 가독성이 좋음.


 

 

  1. 배열 정렬 → Arrays.sort()
  2. 리스트 정렬 → Collections.sort() (Java 8 이상이면 list.sort())
  3. 객체 정렬 → Comparable 구현 or Comparator 사용
  4. 기본형 배열 정렬 → Arrays.sort()만 가능 (Comparator 사용 불가)

정렬 성능 차이는 거의 없지만, 자료구조에 맞는 정렬 메서드를 사용하는 것이 좋음!

'Back_End > JAVA' 카테고리의 다른 글

자바(JAVA)의 Default Interface란?  (1) 2025.02.28
자바(JAVA) DAO, DTO, VO 란?  (0) 2025.02.26
자바(JAVA) Synchronized  (0) 2025.02.24
자바(Java) Optional 이란?  (0) 2025.02.14
얼리 리턴 패턴(Early Return Pattern) 이란?  (0) 2025.02.14