ArrayList 사용할 때, 특정 요소 여러개를 삭제하기 위해 반복문 루프 안에서 remove()를 하면 코드가 작동하지 않거나, 에러가 나는 경우가 있습니다. 예를들어 장바구니 목록에서 체크한 상품들만 삭제한다고 할 때, 반복문 안에서 순서대로 ArrayList의 요소의 체크여부를 확인합니다. 그리고 요소가 체크가 되어있을 때 삭제를 해야하는데, 이렇게 지워버릴 경우 다음 요소들의 순번이 하나씩 앞으로 오게됩니다. 그리고 또다시 삭제를 해야할 때 요소들의 순번이 바뀌어있으므로 에러가 납니다. 이런 상황을 막기 위해서 Iterator를 사용해야 합니다.
- Iterator란? (이터레이터, 반복자)
- 자바의 컬렉션 프레임워크에서 ‘컬렉션’에 저장된 요소들을 읽어오는 방법을 인터페이스로 표준화 한 것.
public interface Iterator {
boolean hasNext();
Object next();
void remove();
}
- hasNext() : 읽어올 요소가 남아있는지 확인하는 메소드. 요소가 있으면 true, 없으면 false를 반환.
- next() : 다음 요소를 반환.
- remove() : next()로 읽어온 요소를 현재 컬렉션에서 제거.
- 메소드 호출 순서 : hasNext() → next() → remove()
사용방법
방법1.
ArrayList<Integer> list = new ArrayList<Integer>();
for( Iterator<Integer> itr = list.iterator(); itr.hasNext(); )
{
list.get( itr.next() );
}
방법2.
ArrayList<Integer> list = new ArrayList<Integer>();
Iterator<Integer> itr = list.iterator();
while( itr.hasNext() )
{
list.get( itr.next() );
}
비슷한 인터페이스들
1. Enumeration<E> 인터페이스
- JDK 1.0부터 사용. Iterator 인터페이스와 같은 기능을 하며, 이전 버전과의 호환성을 위해 남아있습니다.
- Enumeration 대신 Iterator 인터페이스를 사용하는 것을 권장합니다.
2. ListIterator<E> 인터페이스
- Iterator 인터페이스를 상속받아 기능을 추가한 인터페이스.
- Iterator의 경우 한 방향으로만 컬렉션의 요소에 접근할 수 있지만, ListIterator는 양방향 이동이 가능한 것이 특징입니다.
- List 컬렉션 클래스에서만 사용 가능하다는 단점이 있습니다.
