기본 패턴
java
users.sort(Comparator
.comparing(User::getAge)
.thenComparing(User::getName));
for (Map.Entry<String, Integer> entry : scores.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}설명
- 컬렉션을 다룰 때는 "무엇을 저장하느냐"만큼 "어떻게 순회하고 어떤 기준으로 정렬하느냐"가 중요합니다. Java 컬렉션은 이 두 문제를 꽤 명확하게 분리해서 다룹니다.
for-each는 읽기 전용 순회에 가장 자연스럽고,Iterator는 순회 중 제거처럼 제어가 필요할 때 적합합니다.Map은keySet,values,entrySet중 무엇을 순회할지 의도를 분명히 고르는 편이 좋습니다.- 정렬 기준이 도메인의 "기본 순서"라면
Comparable이 자연스럽습니다. 반대로 화면 표시, 검색 결과, 조건별 정렬처럼 상황에 따라 바뀌는 순서라면Comparator가 더 유연합니다. - 현대 Java에서는
Comparator.comparing,thenComparing,reversed,nullsFirst,nullsLast같은 조합형 API 덕분에 정렬 로직을 선언적으로 읽기 쉬워졌습니다. - 컬렉션 순회와 정렬은 결국 "데이터를 저장하는 단계"와 "데이터를 보여주거나 처리하는 단계" 사이의 연결점입니다. 이 지점이 깔끔해야 이후 Stream, 검색, 페이징 코드도 읽기 쉬워집니다.
빠른 정리
| 선택지 | 잘 맞는 상황 |
|---|---|
for-each | 단순 순회, 읽기 중심 |
Iterator | 순회 중 제거, 세밀한 제어 |
entrySet() | Map의 key/value를 함께 다룰 때 |
Comparable | 클래스의 기본 정렬 기준 |
Comparator | 화면/상황별 정렬 전략 |
주의할 점
정렬 기준이 자주 바뀌는 객체에 Comparable만 남발하면 클래스 안에 도메인과 화면 요구사항이 섞이기 쉽습니다.
기본 순서와 상황별 순서를 분리하는 감각이 중요합니다.
참고 링크
3 sources