iterator는 ArrayList, HashSet과 같은 컬렉션을 반복하는 데 사용할 수 있는 객체다. iterator는 반복의 기술 용어기 때문에 반복자라고 한다

내부를 확인해보면 4개의 함수가 있습니다.결국 iterator도 데이터에 접근하기 위해서 있는건데, for while 같은 반복문을 써도 충분히 가능할텐데, 왜 만들어진걸까!
리스트에는 인덱스가 있지만 Set은 순서가 없는(unordered) 컬렉션이기 때문에 인덱스가 없다. iterator는 for-each 반복문이 할 수 없는 일을 할 수 있다. 예를 들어 iterator가 지원하는 경우 반복하는 동안 요소를 제거할 수 있다. 리스트는 또한 양방향으로 반복할 수 있는 iterator를 제공한다. for-each 반복문은 처음부터 끝까지만 반복된다. 인덱스를 사용해 요소에 접근하는 것은 배열로 지원되는 컬렉션에서 약간 더 효율적이다.
그러나 ArrayList 대신 LinkedList를 사용하면 list.get(i)에 액세스할 때마다 연결된 리스트가 i번째 요소까지 모든 요소를 반복해야 하기 때문에 성능이 나빠질 것이다. iterator(따라서 for-each 루프)에는 이 문제가 없다. 컬렉션 자체에 iterator 구현이 있기 때문에 항상 주어진 컬렉션의 요소를 반복하는 가장 좋은 방법을 사용한다
Iterator의 장점
import java.util.ArrayList;
import java.util.Iterator;
public class Main
{
public static void main(String[] args)
{
// 컬렉션 생성
ArrayList<String> cars = new ArrayList<>();
cars.add("벤츠");
cars.add("람보르기니");
cars.add("롤스로이스");
cars.add("페라리");
// iterator 획득
Iterator<String> iterator = cars.iterator();
// while문을 사용한 경우
while(iterator.hasNext())
{
String str = iterator.next();
System.out.println(str);
}
// for-each문을 사용한 경우
for (String str : cars)
{
System.out.println(str);
}
}
}
List<String> fieldNameList = new ArrayList<>();
fieldNameIterator.forEachRemaining(fieldNameList::add);
Java 8 혹은 그 이상의 버전에서는 iterator 타입의 forEachRemaining 메소드를 활용하면 List를 채울 수 있다. forEachRemaining 메소드의 참조로 add() 메소드를 전달하면 해당 iterator 인스턴스의 제네릭 타입의 value를 add하게 된다.