Java에서 컬렉션(Collection)을 순회할 때 사용하는 대표적인 인터페이스로 Iterator와 ListIterator가 있습니다. 두 인터페이스는 이름이 비슷하지만 지원하는 컬렉션의 종류, 순회 방향, 제공하는 기능에서 뚜렷한 차이를 보입니다. 이 글에서는 두 인터페이스의 특징과 차이점을 자세히 살펴보겠습니다.
Iterator란?
Iterator는 Java 컬렉션 프레임워크에서 가장 기본이 되는 순회자(반복자) 인터페이스입니다. 주요 특징은 다음과 같습니다.
다양한 컬렉션 순회 가능: Map, List, Set 등 대부분의 컬렉션을 순회할 수 있습니다.
인덱스 접근 불가: Iterator는 요소의 위치(인덱스) 정보를 제공하지 않습니다.
요소 수정·교체 불가: 순회 중인 컬렉션의 요소를 수정하거나 교체할 수 없으며, 삭제(remove)만 가능합니다.
단방향 순회: 앞쪽(정방향)으로만 요소를 탐색할 수 있고, 역방향 순회는 지원하지 않습니다.
요소 추가 시 예외 발생: 순회 도중 요소를 추가하면 ConcurrentModificationException이 발생합니다.
제공 메서드: hasNext(), next(), remove() 세 가지 메서드를 제공합니다.
ListIterator란?
ListIterator는 Iterator를 상속한 인터페이스로, 오직 List 계열 컬렉션(ArrayList, LinkedList 등)에서만 사용할 수 있습니다. 주요 특징은 다음과 같습니다.
List 전용: List만 순회할 수 있으며, Map이나 Set에는 사용할 수 없습니다.
양방향 순회: 정방향뿐 아니라 역방향으로도 요소를 자유롭게 탐색할 수 있습니다.
인덱스 정보 제공: 현재 위치의 인덱스를 확인할 수 있는 메서드를 제공합니다.
요소 수정·교체 가능: set() 메서드를 통해 순회 중인 요소를 수정하거나 교체할 수 있습니다.
요소 추가 가능: add() 메서드를 사용해 순회 중에도 언제든지 새로운 요소를 추가할 수 있습니다.
제공 메서드: next(), previous(), nextIndex(), previousIndex(), set(), add() 등 다양한 메서드를 제공합니다.
핵심 차이점 요약
| 구분 | Iterator | ListIterator |
|---|---|---|
| 사용 가능 컬렉션 | Map, List, Set | List만 가능 |
| 순회 방향 | 정방향만 가능 | 정방향 + 역방향 모두 가능 |
| 인덱스 접근 | 불가능 | 가능 (nextIndex, previousIndex) |
| 요소 수정/추가 | 불가능 | 가능 (set, add) |
결론
단순히 컬렉션을 앞에서부터 읽기만 한다면 Iterator면 충분합니다. 반면, List를 다루면서 역방향 탐색이 필요하거나 순회 중에 요소를 수정·추가해야 하는 경우에는 ListIterator를 사용하는 것이 효율적입니다. 상황에 맞는 인터페이스를 선택하면 더 깔끔하고 안전한 코드를 작성할 수 있습니다.