Java

Iterator, ListIterator, Enumeration

1space 2025. 6. 23. 19:29

 

자바의 정석[기초편]으로 공부한 내용을 정리한 글입니다.

 

핵심 개념 정리

용어 의미 특징
Iterator 컬렉션 요소를 순서대로 읽는 인터페이스 가장 일반적
ListIterator 양방향 조회 가능 (이전, 다음 이동) List에서만 사용
Enumeration 예전 버전의 Iterator 읽기 전용, 기능 제한
 

 

왜 Iterator가 필요할까?

컬렉션(List, Set 등)에 저장된 요소를 하나하나 꺼내서 처리하려면 반복문이 필요합니다.
하지만 각 컬렉션마다 내부 구조가 달라서, 반복문을 직접 만들기엔 불편함이 많습니다.

그래서 Java는 공통적으로 사용할 수 있도록 Iterator 인터페이스를 제공합니다.

 

Iterator 인터페이스 정의

public interface Iterator {
    boolean hasNext(); // 다음 요소가 있는가?
    Object next();     // 다음 요소 꺼내기
    void remove();     // 현재 요소 삭제 (선택 사항)
}

이 인터페이스를 구현한 클래스가 실제 동작을 하게 됩니다.

 

사용 예시

List list = new ArrayList();
list.add("1");
list.add("2");
list.add("3");

Iterator it = list.iterator();  // Iterator 생성

while (it.hasNext()) {          // 다음 요소가 있다면
    Object obj = it.next();     // 꺼내서 출력
    System.out.println(obj);
}

 

  1. iterator() 메서드로 컬렉션에서 Iterator 객체를 얻음
  2. hasNext() → 요소가 더 있는지 확인
  3. next() → 다음 요소 꺼냄
  4. 반복하면서 모든 요소 출력

 

결과

1
2
3

ArrayList는 저장 순서 유지하기 때문에 저장한 순서대로 출력됨.

 

일반 for문과 비교

이 코드는 Iterator와 완전히 같은 결과를 냅니다:

for (int i = 0; i < list.size(); i++) {
    Object obj = list.get(i);
    System.out.println(obj);
}

차이점:

  • for문: 인덱스로 접근 → List만 가능
  • Iterator: 내부 구조 몰라도 가능 → Set에서도 사용 가능

 

Set에서는 왜 Iterator가 필요할까?

Set은 순서를 보장하지 않기 때문에 인덱스 접근 (get(i))이 불가능합니다.
하지만 Iterator는 어떤 컬렉션에서도 요소를 순회할 수 있게 해줍니다.

 

정리

  • Iterator는 컬렉션 요소를 순서대로 꺼내기 위한 통일된 방법입니다.
  • ArrayList, HashSet, LinkedList 등 어떤 컬렉션이든 쓸 수 있습니다.
  • 읽기 전용이라서 삭제나 변경은 제한적이며, 순회 용도로 가장 많이 사용됩니다.

 

Map과 Iterator

문제 상황

  • List, Set은 .iterator()를 직접 쓸 수 있음.
  • 하지만 Map은 (key, value) 쌍으로 이루어져 있어서,
    직접 .iterator()를 쓸 수 없습니다.
 
Map map = new HashMap();  
// map.iterator(); ❌ 불가능

 

해결 방법

Map의 내용을 Set 형태로 바꿔서,
그 Set에 대해 .iterator()를 사용해야 합니다.

방법 1: 한 줄로 쓰기

Iterator it = map.entrySet().iterator();
  • map.entrySet() → key-value 쌍을 Set으로 변환
  • .iterator() → Set에 대해 Iterator 생성
  • it은 key-value쌍을 하나씩 꺼낼 수 있음

방법 2: 두 줄로 나눠서 쓰기

Set eSet = map.entrySet();
Iterator it = eSet.iterator();

이것도 결과는 똑같습니다.
→ entrySet() 결과를 먼저 Set 변수에 담고,
→ 그 Set에 대해 iterator()를 호출한 것.

설명

① map.entrySet() → Set 생성

  • entrySet()은 key-value 쌍을 Set으로 바꿔줌
    → 즉, Set<Map.Entry<K, V>> 가 만들어짐

② iterator() 호출

  • Set이니까 .iterator() 가능
  • 결과는 Iterator<Map.Entry<K, V>>

③ 최종적으로 Iterator가 변수 it에 저장

Iterator it = (Iterator<Map.Entry<K, V>>) map.entrySet().iterator();

정리

1단계 map.entrySet()으로 Set 얻기
2단계 Set.iterator()로 Iterator 얻기
3단계 Iterator를 변수에 저장해서 사용
 

그럼 이걸 어디에 쓰냐?

while (it.hasNext()) {
    Map.Entry entry = (Map.Entry) it.next();
    System.out.println(entry.getKey() + " = " + entry.getValue());
}

이렇게 하면 Map의 key-value 쌍을 순서대로 모두 출력할 수 있습니다.

전체 코드

Map map = new HashMap();
map.put("name", "홍길동");
map.put("age", "20");

Iterator it = map.entrySet().iterator();
while (it.hasNext()) {
    Map.Entry entry = (Map.Entry) it.next();
    System.out.println(entry.getKey() + " = " + entry.getValue());
}

 

name = 홍길동
age = 20

 

'Java' 카테고리의 다른 글

Comparator와 Comparable  (0) 2025.06.23
Arrays의 메서드  (0) 2025.06.23
스택과 큐  (0) 2025.06.23
LinkedList  (0) 2025.06.23
ArrayList  (0) 2025.06.23