JAVA Collections 클래스 유틸리티 메서드 총정리
📌 정렬부터 최소값, 셔플까지 한 번에 해결하는 Java 컬렉션 활용법
자바 프로그래밍을 하다 보면 리스트나 셋, 맵 같은 컬렉션을 다룰 일이 정말 많습니다.
그럴 때마다 정렬은 어떻게 하지, 최소값은 어떻게 구하지 고민하신 적 있으신가요?
사실 이런 문제는 Collections 클래스 하나로 아주 간단하게 해결할 수 있습니다.
기존에는 개발자가 직접 로직을 짜서 해결해야 했던 일들을, 이제는 단 몇 줄의 코드로 깔끔하게 처리할 수 있죠.
이번 글에서는 실무에서도 자주 쓰이는 Collections의 대표적인 유틸리티 메서드를 예제와 함께 자세히 소개해드릴게요.
Collections 클래스는 java.util 패키지에 포함된 유틸리티 클래스입니다.
대표적으로 정렬(sort), 섞기(shuffle), 최소/최대값 찾기(min/max), 빈 컬렉션 생성, 동기화 래핑 등의 기능을 제공합니다.
덕분에 컬렉션을 다룰 때 반복적으로 등장하는 로직을 줄이고 코드 가독성과 유지보수성을 높일 수 있어요.
이 글에서는 각 메서드가 실제로 어떻게 쓰이는지, 어떤 상황에서 유용한지까지 예제 코드와 함께 차근차근 알려드리겠습니다.
📋 목차
🔗 Collections 클래스란?
자바에서 컬렉션(Collection)이란 데이터를 효율적으로 저장하고 다룰 수 있도록 해주는 List, Set, Map 등의 자료 구조를 말합니다.
그런데 이러한 컬렉션을 정렬하거나 복사하거나 값을 섞는 등의 작업은 개발자가 직접 알고리즘을 구현해야 했죠.
이럴 때 바로 필요한 것이 Collections 유틸리티 클래스입니다.
Collections 클래스는 java.util 패키지에 포함된 static 메서드 집합으로, 컬렉션 객체를 더 쉽게 다룰 수 있도록 도와주는 기능들을 제공합니다.
대표적으로는 정렬(sort), 섞기(shuffle), 반전(reverse), 최소/최대값 찾기(min/max), 빈 컬렉션 생성, 동기화 컬렉션 생성 등 다양한 기능이 있습니다.
- 🛠️정렬: Collections.sort()
- 🔀셔플: Collections.shuffle()
- 🔎최솟값/최댓값: Collections.min(), Collections.max()
- 📋읽기 전용 리스트: Collections.unmodifiableList()
💡 TIP: Collections 클래스는 java.util.Arrays의 Arrays.sort()와 혼동하기 쉬운데, Arrays는 배열을 대상으로 하고, Collections는 List 같은 컬렉션을 대상으로 한다는 점을 기억하세요.
아래는 Collections 클래스의 기본 구조입니다.
import java.util.*;
public class Main {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(5, 2, 9, 1, 3);
Collections.sort(numbers); // 오름차순 정렬
Collections.shuffle(numbers); // 무작위 섞기
int min = Collections.min(numbers); // 최솟값
int max = Collections.max(numbers); // 최댓값
System.out.println("정렬된 리스트: " + numbers);
System.out.println("최솟값: " + min);
System.out.println("최댓값: " + max);
}
}
이처럼 Collections 클래스는 간단한 호출만으로 복잡한 연산을 쉽게 처리할 수 있게 해줍니다.
코드의 가독성도 높아지고 유지보수도 훨씬 수월해지니, 꼭 익혀두시길 추천드립니다.
🛠️ 정렬 메서드 sort 사용법
Collections 클래스에서 가장 많이 사용되는 메서드 중 하나는 단연 sort()입니다.
List 컬렉션의 요소들을 정렬할 때 아주 유용하게 쓰이죠.
별도의 정렬 알고리즘을 구현할 필요 없이 단 한 줄로 오름차순 정렬이 가능합니다.
기본적으로는 요소들이 Comparable 인터페이스를 구현하고 있다면, 해당 요소의 자연 순서(Natural Order)를 기준으로 정렬됩니다.
예를 들어, 숫자는 오름차순, 문자열은 사전 순으로 정렬되죠.
List<Integer> numbers = Arrays.asList(4, 1, 3, 9, 2);
Collections.sort(numbers); // 결과: [1, 2, 3, 4, 9]
만약 사용자 정의 객체를 정렬하고 싶다면, Comparator 인터페이스를 사용하면 됩니다.
아래 예제처럼 이름순 또는 점수순으로도 쉽게 정렬할 수 있어요.
class Student {
String name;
int score;
Student(String name, int score) {
this.name = name;
this.score = score;
}
}
List<Student> students = Arrays.asList(
new Student("Kim", 85),
new Student("Lee", 92),
new Student("Park", 78)
);
// 점수 기준 오름차순 정렬
Collections.sort(students, Comparator.comparingInt(s -> s.score));
이처럼 Comparator.comparing() 또는 람다식을 사용하면 객체의 특정 필드를 기준으로 원하는 대로 정렬이 가능합니다.
내림차순 정렬을 하고 싶다면 Collections.reverseOrder()를 활용하면 되죠.
💎 핵심 포인트:
List를 정렬할 때는 Arrays.sort()가 아닌 Collections.sort()를 사용해야 하며, 이 메서드는 리스트 자체를 정렬하기 때문에 원본이 변경됩니다.
이처럼 정렬을 위해 Collections.sort()를 활용하면, 복잡한 정렬 알고리즘 없이도 자바 컬렉션을 아주 손쉽게 정리할 수 있습니다.
실무에서도 가장 빈번하게 쓰이는 메서드이니 반드시 익혀두세요.
⚙️ min과 max로 값 찾기
컬렉션에서 가장 작은 값이나 가장 큰 값을 찾고 싶을 때도 Collections 클래스는 아주 유용합니다.
Collections.min()과 Collections.max() 메서드를 사용하면 반복문 없이 단 한 줄로 원하는 결과를 얻을 수 있어요.
기본적으로는 컬렉션 요소가 Comparable을 구현하고 있어야 하며, 자연 정렬 기준으로 최소/최대값을 판단합니다.
숫자, 문자열, 날짜 등 대부분의 기본 자료형 클래스는 이미 Comparable을 구현하고 있으니 바로 사용 가능합니다.
List<Integer> scores = Arrays.asList(78, 95, 82, 63, 88);
int minScore = Collections.min(scores); // 결과: 63
int maxScore = Collections.max(scores); // 결과: 95
만약 사용자 정의 객체에서 최소/최대값을 찾고 싶다면 Comparator를 함께 사용하면 됩니다.
예를 들어 학생 중에서 가장 점수가 높은 사람을 찾는 경우도 가능합니다.
class Student {
String name;
int score;
Student(String name, int score) {
this.name = name;
this.score = score;
}
}
List<Student> students = Arrays.asList(
new Student("Kim", 85),
new Student("Lee", 92),
new Student("Park", 78)
);
// 최고 점수 학생
Student top = Collections.max(students, Comparator.comparingInt(s -> s.score));
💎 핵심 포인트:
min(), max()는 컬렉션에 요소가 하나라도 없다면 NoSuchElementException을 발생시키므로 항상 비어 있는지 체크하는 습관이 필요합니다.
복잡한 조건을 루프를 돌며 직접 비교하던 예전 방식보다 훨씬 간결하고 직관적인 코딩이 가능해지니 꼭 활용해보세요.
🔀 shuffle과 reverse로 컬렉션 순서 변경
Collections 클래스는 정렬뿐만 아니라 컬렉션의 순서를 섞거나 뒤집는 기능도 제공합니다.
특히 게임 로직이나 랜덤한 선택이 필요한 상황에서 shuffle() 메서드는 정말 유용하죠.
shuffle()은 리스트의 요소 순서를 무작위로 섞습니다.
기본적으로 내부적으로 java.util.Random 인스턴스를 이용하며, 동일한 결과를 얻고 싶다면 seed 값을 지정할 수도 있어요.
List<String> cards = Arrays.asList("♠", "♥", "♣", "◆");
Collections.shuffle(cards);
System.out.println(cards); // 무작위 순서 출력
반면, reverse() 메서드는 리스트의 요소 순서를 뒤집는 기능입니다.
예를 들어 오름차순 정렬 후 reverse()를 사용하면 내림차순 정렬 효과를 얻을 수 있습니다.
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Collections.reverse(numbers); // 결과: [5, 4, 3, 2, 1]
💡 TIP: shuffle과 reverse는 모두 List 타입에만 적용 가능합니다.
Set이나 Map에는 순서 개념이 없기 때문에 사용할 수 없다는 점에 주의하세요.
- 🎲랜덤 요소가 필요한 게임, 추첨 등에 shuffle() 유용
- ⬇️오름차순 정렬 후 reverse()로 내림차순 처리
- 📌List 타입에서만 작동하므로 타입 확인 필수
컬렉션 순서를 마음대로 조작할 수 있다는 건, 알고리즘 구현 시 아주 강력한 도구가 되어줍니다.
shuffle과 reverse는 단순해 보이지만 활용도가 높으니 꼭 기억해두세요.
💡 그 외 유용한 메서드들
Collections 클래스에는 sort, min, max 외에도 실무에서 유용하게 사용할 수 있는 다양한 메서드가 포함되어 있습니다.
이 메서드들을 알고 있으면 코드가 훨씬 간결해지고, 재사용성도 높아지죠.
📌 빈 컬렉션 생성하기
컬렉션이 절대 변경되지 않도록 하거나, 초기 상태를 표현할 때 빈 컬렉션을 리턴하는 메서드들이 있습니다.
- 📭
Collections.emptyList() - 📭
Collections.emptySet() - 📭
Collections.emptyMap()
📌 읽기 전용 컬렉션 만들기
불변(immutable) 컬렉션이 필요한 경우, unmodifiable 계열 메서드를 통해 읽기 전용으로 만들 수 있습니다.
이는 외부에서 데이터를 변경하지 못하도록 보호하는 데 유용하죠.
List<String> original = Arrays.asList("A", "B", "C");
List<String> readOnly = Collections.unmodifiableList(original);
readOnly.add("D"); // UnsupportedOperationException 발생
📌 동기화 컬렉션 생성하기
멀티스레드 환경에서 컬렉션이 동시에 접근되는 경우, 동기화 래퍼를 사용하면 안전하게 처리할 수 있습니다.
- 🧵
Collections.synchronizedList() - 🧵
Collections.synchronizedMap()
💎 핵심 포인트:
Java 9 이후에는 List.of(), Map.of() 같은 메서드도 등장했지만, Collections 클래스는 여전히 다양한 상황에서 폭넓게 쓰이고 있습니다.
이처럼 Collections 클래스는 컬렉션을 다루는 거의 모든 상황에 유용한 도구들을 제공해줍니다.
기본 기능뿐 아니라 빈 컬렉션, 읽기 전용, 동기화 처리까지 폭넓게 활용할 수 있으니 꼭 알아두세요.
❓ 자주 묻는 질문 (FAQ)
Collections와 Collection의 차이점은 무엇인가요?
즉, Collections는 List, Set 등의 구현체를 다루기 위한 static 메서드를 제공합니다.
Collections.sort()와 Arrays.sort()는 어떤 차이가 있나요?
각각 처리 대상이 다르므로 사용하는 자료형에 맞게 선택해야 합니다.
Collections.min()을 사용할 때 예외가 발생하는 경우는?
사용 전에 isEmpty()로 비어 있는지 확인하는 습관이 필요합니다.
shuffle() 메서드는 어떤 상황에서 유용하게 쓰이나요?
Collections.reverse()는 어떤 컬렉션에서 사용 가능한가요?
Set이나 Map은 순서 개념이 없기 때문에 reverse() 메서드가 적용되지 않습니다.
읽기 전용 리스트로 변경하면 어떤 장점이 있나요?
Collections 클래스는 멀티스레드 환경에서도 안전한가요?
Collections 클래스를 import 하지 않으면 어떻게 되나요?
컴파일 오류가 발생하므로 반드시 import 문을 추가해야 합니다.
📌 Collections 클래스를 알면 자바 컬렉션이 쉬워진다
지금까지 자바의 Collections 클래스가 제공하는 다양한 유틸리티 메서드들을 알아보았습니다.
정렬, 최소/최대값 찾기, 섞기, 뒤집기뿐 아니라, 읽기 전용 컬렉션이나 동기화 컬렉션 등 실무에서 자주 활용할 수 있는 기능들이 가득했죠.
이 모든 기능은 java.util 패키지 안에 포함되어 있으며, 단 몇 줄의 코드만으로도 복잡한 로직을 훨씬 더 간단하게 처리할 수 있게 해줍니다.
Collections 클래스는 단순한 도우미가 아니라, 자바 개발자라면 반드시 알아야 할 핵심 도구입니다.
특히 리스트와 같은 컬렉션을 자주 다루는 환경이라면, 이 클래스의 메서드들만 잘 활용해도 개발 생산성을 크게 높일 수 있습니다.
반복문 대신 한 줄로 끝내는 깔끔한 코드, 지금 바로 시작해보세요!
🏷️ 관련 태그 : java, java컬렉션, Collections클래스, 자바정렬, 자바유틸리티, java개발자팁, 자바리스트, comparator, collections정렬, java유용한클래스