자바의 정석[기초편]으로 공부한 내용을 정리한 글입니다.
핵심 개념 정리
용어 | 의미 | 특징 |
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);
}
- iterator() 메서드로 컬렉션에서 Iterator 객체를 얻음
- hasNext() → 요소가 더 있는지 확인
- next() → 다음 요소 꺼냄
- 반복하면서 모든 요소 출력
결과
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 |