Java컬렉션과 제네릭

컬렉션 순회, 정렬, Comparator

List와 Map을 어떻게 순회하고, 정렬 기준을 Comparable과 Comparator 중 어디에 둘지 정리합니다.

마지막 수정 2026년 3월 22일

기본 패턴

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는 순회 중 제거처럼 제어가 필요할 때 적합합니다. MapkeySet, 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