Iterator란?
자바에서 Iterator(반복자)는 데이터 컬렉션을 순회하고 각 요소에 접근하기 위한 인터페이스이다. Iterator를 사용하면 컬렉션의 내용을 순차적으로 검색할 수 있으며, 데이터를 수정하는 동안 안정성을 제공한다. Iterator는 자바 컬렉션 프레임워크의 일부로 제공되며, List,Set,Mep 등 다양한 컬렉션 클래스와 함께 사용할 수 있다.
다음 요소가 있는지 여부를 반환한다. 만약 다음 요소가 있다면 true를 반환하고, 그렇지 않다면 false를 반환한다.
다음 요소를 반환한다. hasNext() 메서드로 확인한 후에 호출해야 하며, 다음 요소가 없는 경우 NoSuchElementException 예외가 발생한다.
현재 요소를 삭제한다. 이 메서드는 선택적으로 지원하며, 구체적인 컬렉션 구현에 따라 지원되지 않을 수 있다. 지원하지 않는 경우 UnsupportedOperationException 예외가 발생한다.
Iterator 인터페이스를 사용하여 ArrayList를 순회하면서 요소를 출력하는 예제로는
import java.util.ArrayList;
import java.util.Iterator;
public class IteratorExample {
public static void main(String[] args) {
ArrayList<String> names = new ArrayList<>();
names.add("Alice");
names.add("Bob");
names.add("Charlie");
// Iterator를 생성
Iterator<String> iterator = names.iterator();
// hasNext()를 사용하여 다음 요소 확인 및 출력
while (iterator.hasNext()) {
String name = iterator.next();
System.out.println(name);
}
}
}
위 예제에서는 iterator() 메서드를 사용하여 ArrayList의 Iterator를 가져와 hasNext() 및 next() 메서드를 사용하여 요소를 반복적으로 처리한다.
Iterator 추가 설명
Iterator는 컬렉션의 요소를 읽는 데 주로 사용된다. 요소를 수정하는 데는 ListIterator를 사용할 수 있다. ListIterator는 Iterator 인터페이스를 확장하며, 요소를 추가, 수정 및 삭제하는 데 사용할 수 있다.
향상된 for 루프를 사용하여 컬렉션을 더 간단하게 순회할 수 있다.
for (String name : names) {
System.out.println(name);
}
이런식으로 반복자를 직접 다루지 않아도 컬렉션을 순회할 수 있다.
Iterator 인터페이스는 제네릭으로 정의되어 있어, 사용할 데이터 타입을 명시할 수 있다. 이를 통해 타입 안정성을 유지하고 형변환을 피할 수 있다. 위 예제에서 Iterator< String > 을 사용한 것처럼 컬렉션의 데이터 타입을 명시적으로 지정할 수 있다.
Iterator를 사용하여 컬렉션을 순회하면서 요소를 삭제할 때는 remove() 메서드를 호출해야 한다. 이 때 주의해야 할 점은 remove()를 호출하기 전에 next()로 요소를 읽어야 한다. 그렇지 않으면 IllegalStateException 예외가 발생한다.
Iterator는 컬렉션과 함께 작동하는 반면, 배열은 직접적으로 Iterator를 사용하지 않고 인덱스로 요소에 접근한다.
만약 Iterator를 사용하여 컬렉션을 순회하면서 중간에 컬렉션을 수정하면 ConcurrentModificationException 예외가 발생한다. 이에 대한 대응책으로는 순회 중에 컬렉션을 수정하지 않거나, 수정이 필요한 경우는 Iterator가 아닌 다른 방법을 사용하는 것이 좋다.
Iterator는 어디에 쓰일까?
Iterator는 컬렉션(ex. ArrayList, HashSet, HashMap)의 요소를 순회하고 각 요소에 접근하는 데 사용된다. 이를 통해 데이터 검색, 필터링, 처리, 출력 등 다양한 작업을 수행할 수 있다.
Iterator를 사용하여 컬렉션에서 특정 조건을 충족하는 요소를 찾고 필터링할 수 있다. 예를 들어, 특정 조건에 맞는 모든 항목을 찾거나 삭제할 때 사용될 수 있다.
Iterator는 일반적으로 데이터 수정보다는 데이터 검색 및 순회에 주로 사용된다. 데이터 수정이 팔요한 경우, ListIterator를 사용할 수 있으나, 주의해서 사용해야 한다.
현업에서 데이터의 일관성과 유효성을 검증하는 데 Iterator를 사용할 수 있다. 예를 들어, 중복된 요소를 확인하거나 데이터의 정합성을 확인할 때 유용하다.
Iterator를 사용하여 컬렉션의 데이터를 순회하면서 화면에 출력하거나 파일에 저장하는 작업에 활용된다.
Iterator는 데이터베이스 쿼리나 파일 시스템과 같은 외부 데이터 소스에서 데이터를 가져와 처리하는 데도 사용된다.
Iterator는 스레드 간 데이터 공유에서도 사용된다. 여러 스레드가 동시에 컬렉션을 수정하거나 순회할 때 동기화 문제를 방지하기 위해 Iterator를 사용할 수 있다.
다양한 자바 API 및 라이브러리에서 Iterator를 사용한다. 예를 들어, 스프링 프레임워크, Hibernate ORM, 자바의 컬렉션 API, 그리고 파일 처리 라이브러리에서 Iterator를 활용한다.