//추가
System.out.println("for-each 사용");
for (int value : myArray) {
System.out.println("value = " + value);
}
실행 결과
...
for-each 사용
value = 1
value = 2
value = 3
value = 4
for (int value : myArray) {
System.out.println("value = " + value);
}
while (iterator.hasNext()) {
Integer value = iterator.next();
System.out.println("value = " + value);
}

자바 컬렉션 프레임워크는 배열 리스트, 연결 리스트, 해시 셋, 연결 해시 셋, 트리 셋 등등 다양한 자료 구조를 제공함
자바는 컬렉션 프레임워크를 사용하는 개발자가 편리하고 일관된 방법으로 자료 구조를 순회할 수 있도록 Iterable 인터페이스를 제공하고, 이미 각각의 구현체에 맞는 Iterator도 다 구현해둠
자바 Collection 인터페이스의 상위에 Iterable이 있다는 것은 모든 컬렉션을 iterable과 iterator를 사용해서 순회할 수 있다는 뜻임
Map의 경우 Key뿐만 아니라 Value까지 있기 때문에 바로 순회를 할 수는 없음
Key나 Value를 정해서 순회할 수 있는데, keySet(), values()를 호출하면 Set, Collection을 반환하기 때문에 Key나 Value를 정해서 순회할 수 있음Entry를 Set 구조로 반환하는 entrySet()도 순회가 가능함package collection.iterable;
import java.util.*;
public class JavaIterableMain {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
Set<Integer> set = new HashSet<>();
set.add(1);
set.add(2);
set.add(3);
printAll(list.iterator());
printAll(set.iterator());
foreach(list);
foreach(set);
}
private static void printAll(Iterator<Integer> iterator) {
System.out.println("iterator = " + iterator.getClass());
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
private static void foreach(Iterable<Integer> iterable) {
System.out.println("iterable = " + iterable.getClass());
for (Integer i : iterable) {
System.out.println(i);
}
}
}
실행결과
iterator = class java.util.ArrayList$Itr
1
2
3
iterator = class java.util.HashMap$KeyIterator
1
2
3
iterable = class java.util.ArrayList
1
2
3
iterable = class java.util.HashSet
1
2
3
iterator, Iterable은 인터페이스임
printAll(), foreach() 메서드는 새로운 자료구조가 추가되어도 해당 자료구조가 Iterator, Iterable만 구현하고 있다면 코드 변경 없이 사용할 수 있음
java.util.ArrayListSItr : ArrayList의 Iterator는 ArrayList의 중첩 클래스임
java.util.HashMapSKeyIterator : HashSet 자료 구조는 사실은 내부에서 HashMap 자료 구조를 사용함
Iterator(반복자) 디자인 패턴은 객체 지향 프로그래밍에서 컬렉션의 요소들을 순회할 때 사용되는 디자인 패턴임
- 이 패턴은 컬렉션의 내부 표현 방식을 노출시키지 않으면서도 그 안의 각 요소에 순차적으로 접근할 수 있게 해줌
Iterator패턴은 컬렉션의 구현과는 독립적으로 요소들을 탐색할 수 있는 방법을 제공하며, 이로 인해 코드의 복잡성을 줄이고 재사용성을 높일 수 있음