순회3 - 자바가 제공하는 Iterable, Iterator
2024. 6. 21. 16:02ㆍ김영한 Java/컬렉션 프레임워크

- 자바 컬렉션 프레임워크는 배열 리스트, 연결 리스트, 해시 셋, 연결 해시 셋, 트리 셋 등등 다양한 자료 구조를 제공한다.
- 자바는 컬렉션 프레임워크를 사용하는 개발자가 편리하고 일관된 방법으로 자료 구조를 순회할 수 있도록 Iterable 인터페이스를 제공하고, 이미 각각의 구현체에 맞는 Iterator도 다 구현해두었다.
- 자바 Collection 인터페이스의 상위에 Iterable이 있다는 것은 모든 컬렉션을 Iterable과 Iterator를 사용해서 순회할 수 있다는 뜻이다.
- Map의 경우 Key뿐만 아니라 Value까지 있기 때문에 바로 순회를 할 수는 없다. 대신에 Key나 Value를 정해서 순회할 수 있는데, KeySet(), Values()를 호출하면 Set, Collection을 반환하기 때문에 Key나 Value를 정해서 순회할 수 있다. 물론 Entry를 Set구조로 번환하는 entrySet()도 순회가 가능하다.
정리하면 자바가 제공하는 컬렉션 프레임워크의 모든 자료 구조는 Iterable과 Iterator를 사용해서 편리하고 일관된 방법으로 순회할 수 있다. 물론 Iterable을 구현하기 때문에 향상된 for문도 사용할 수 있다.
package collection.iterable;
import java.util.*;
public class JavaIterableMain {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
Iterator<Integer> listIter = list.iterator();
printAll(listIter);
foreach(list);
Set<Integer> set = new HashSet<>();
set.add(1);
set.add(2);
set.add(3);
Iterator<Integer> setIter = set.iterator();
printAll(setIter);
foreach(set);
}
private static void foreach(Iterable<Integer> list) {
for(Integer i : list){
System.out.println(i);
}
}
private static void printAll(Iterator<Integer> iterator){
System.out.println("iterator = " + iterator.getClass());
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
실행 결과
iterator = class java.util.ArrayList$Itr
1
2
3
for-each
1
2
3
iterator = class java.util.HashMap$KeyIterator
1
2
3
for-each
1
2
3
- Iterator, Iterable은 인터페이스이다. 따라서 다형성을 적극 활용할 수 있다.
- printAll(), forEach() 메서드는 새로운 자료 구조가 추가되어도 해당 자료 구조가 Iterator, Iterable만 구현하고 있다면 코드 변경 없이 사용할 수 있다.
- java.util.ArrayList$Itr : ArrayList의 Iterator는 ArrayList의 중첩 클래스이다.
- java.util.HashMap$KeyIterator : HashSet 자료 구조는 사실은 내부에서 HashMap 자료 구조를 사용한다. HashMap 자료 구조에서 value를 사용하지 않으면 HashSet과 같다.
'김영한 Java > 컬렉션 프레임워크' 카테고리의 다른 글
| 정렬2 - Comparable, Comparator (0) | 2024.06.23 |
|---|---|
| 정렬1 - Comparable, Comparator (0) | 2024.06.23 |
| 순회2 - 향상된 for문 (0) | 2024.06.21 |
| 순회1 - 직접 구현하는 Iterable, Iterator (0) | 2024.06.21 |
| Deque와 Stack, Queue (0) | 2024.06.20 |