Java ArrayList 정렬 방법(오름차, 내림차, 사용자 정의, Stream)

Java에서 ArrayList는 동적인 배열을 제공하여 다양한 데이터 구조를 다루기 쉽게 해줍니다. 특히, ArrayList를 정렬하는 것은 데이터를 효율적으로 관리하는 데 필수적인 과정 중 하나입니다. 오늘은 Java ArrayList를 정렬하는 다양한 방법을 살펴보겠습니다. 코드와 함께 예시를 보며 쉽게 이해할 수 있도록 설명할게요!

Java ArrayList 정렬 방법(오름차, 내림차, 사용자 정의, Stream)Java ArrayList 정렬 방법(오름차, 내림차, 사용자 정의, Stream)

1. ArrayList란 무엇인가?

ArrayList는 Java의 java.util 패키지에 포함된 클래스입니다. 고정된 크기의 배열과 달리, ArrayList는 동적으로 크기가 조정됩니다. 데이터를 추가하거나 삭제할 때마다 크기가 변하며, 다루기 쉽고 유연한 자료구조죠.

import java.util.ArrayList;

public class ArrayListExample {
    public static void main(String[] args) {
        // ArrayList 선언
        ArrayList<String> fruits = new ArrayList<>();

        // 값 추가
        fruits.add("Apple");
        fruits.add("Banana");
        fruits.add("Orange");

        // 값 출력
        System.out.println(fruits);
    }
}

위 코드에서처럼 ArrayList는 객체를 생성하고 .add() 메서드를 사용하여 값을 추가합니다. 그럼, 이제 본격적으로 정렬에 대해 알아볼까요?


2. 기본적인 오름차순 정렬

Java에서 ArrayList를 정렬하는 가장 간단한 방법은 Collections.sort() 메서드를 사용하는 것입니다. 이 메서드는 ArrayList의 원소들을 오름차순으로 정렬해줍니다.

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

public class SortExample {
    public static void main(String[] args) {
        ArrayList<String> fruits = new ArrayList<>();
        fruits.add("Apple");
        fruits.add("Banana");
        fruits.add("Orange");
        fruits.add("Mango");

        // 오름차순 정렬
        Collections.sort(fruits);

        // 정렬 후 출력
        System.out.println(fruits);
    }
}

결과:

[Apple, Banana, Mango, Orange]

위 코드에서 Collections.sort()를 사용하여 문자열이 알파벳 순서대로 정렬되었습니다. 숫자일 경우에도 기본적으로 오름차순으로 정렬됩니다.


3. 내림차순 정렬

ArrayList를 내림차순으로 정렬하려면 어떻게 해야 할까요? Collections.sort() 메서드와 함께 Collections.reverseOrder()를 사용하면 쉽게 해결할 수 있습니다.

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

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

        // 내림차순 정렬
        Collections.sort(numbers, Collections.reverseOrder());

        // 정렬 후 출력
        System.out.println(numbers);
    }
}

결과:

[9, 7, 5, 3, 1]

Collections.reverseOrder()는 Comparator를 반환하며, 이를 sort() 메서드의 두 번째 인자로 넘겨줌으로써 내림차순으로 정렬할 수 있습니다.


4. 사용자 정의 정렬

기본 정렬 방식 외에도, 특정 기준에 따라 정렬을 해야 하는 경우가 있습니다. 예를 들어, 객체 리스트를 정렬하려면 Comparator를 사용하여 정렬 기준을 정의할 수 있습니다.

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

class Student {
    String name;
    int age;

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

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

public class CustomSortExample {
    public static void main(String[] args) {
        ArrayList<Student> students = new ArrayList<>();
        students.add(new Student("John", 21));
        students.add(new Student("Alice", 23));
        students.add(new Student("Bob", 20));

        // 나이순 오름차순 정렬
        Collections.sort(students, new Comparator<Student>() {
            @Override
            public int compare(Student s1, Student s2) {
                return s1.age - s2.age;
            }
        });

        // 정렬 후 출력
        for (Student s : students) {
            System.out.println(s);
        }
    }
}

결과:

Bob (20)
John (21)
Alice (23)

위 코드에서 우리는 Comparator 인터페이스를 구현하여 Student 객체의 나이 기준으로 오름차순 정렬했습니다. 이처럼 특정 필드를 기준으로 정렬하고 싶다면 Comparator를 직접 구현하여 사용할 수 있습니다.


5. Stream을 이용한 정렬

Java 8부터는 Stream API를 사용하여 더욱 간결하게 정렬할 수 있습니다. Stream을 활용한 방법은 특히 데이터 처리에 있어 매우 직관적이고 유용합니다.

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class StreamSortExample {
    public static void main(String[] args) {
        ArrayList<String> fruits = new ArrayList<>();
        fruits.add("Banana");
        fruits.add("Apple");
        fruits.add("Mango");
        fruits.add("Orange");

        // Stream을 이용한 오름차순 정렬
        List<String> sortedFruits = fruits.stream()
                                          .sorted()
                                          .collect(Collectors.toList());

        // 정렬 후 출력
        System.out.println(sortedFruits);
    }
}

결과:

[Apple, Banana, Mango, Orange]

Stream API는 컬렉션을 스트림으로 변환하고 다양한 연산을 수행할 수 있는 강력한 도구입니다. 위 예시에서는 sorted() 메서드를 사용하여 ArrayList를 정렬한 후, 다시 리스트로 변환하였습니다.


마무리

ArrayList를 정렬하는 방법은 다양하며, 상황에 맞게 적절한 방법을 선택하면 됩니다. Collections.sort()를 사용한 기본 정렬부터, Comparator를 활용한 사용자 정의 정렬, 그리고 Java 8의 Stream API까지 각 방식의 장단점을 이해하고 적용해 보세요. 이를 통해 보다 효율적인 데이터 처리가 가능할 것입니다.


Tip: 더 복잡한 정렬을 해야 하는 경우, 여러 기준을 적용할 수 있습니다. 예를 들어, 나이순으로 먼저 정렬한 후 이름순으로 다시 정렬하고 싶다면, ComparatorthenComparing() 메서드를 사용할 수 있습니다.

Java ArrayList를 다루는 다양한 테크닉을 익히고, 실전에서 활용해보세요!