Iterator(반복자)
는 컬렉션의 요소들을 순회할 수 있는 기능을 제공하는 인터페이스입니다. 컬렉션의 순회라하면은 for, while
의 반복문을 사용해서 뒤져보면되는데 왜 Iterator
를 쓸까요?
그 이유는 반복문에 비해 직관적으로 메소드를 이용해서 요소를 순회할 수 있다는 것과 Set과 같은 인덱스가 없는 컬렉션에서의 순회를 위해서 등 여러 이유가 있습니다. 정리하자면 다음과 같은 장점으로 인해 Iterator
를 사용한다고 할 수 있습니다.
와 같은 장점으로 인해서 컬렉션에서는 Iterator를 사용하는 것이 여러므로 편리합니다.
속도는 Iterator가 객체를 생성하고 호출하는 과정때문에 반복문보다는 조금 느리다고 합니다.
Iterator
가 지원하는 메소드는 다음과 같습니다.
메소드 | 설명 |
---|---|
boolean hasNext() | 더 반복할 객체(다음 객체)가 있는지 여부를 반환 |
E next() | 컬렉션의 다음 객체를 가져온다 |
void remove() | next()로 가져온 객체를 컬렉션에서 삭제 |
Iterable
인터페이스는 구현 클래스에서 Iterator를 사용하기 위한 iterator()
를 가지고 있는 인터페이스입니다. 따라서 Iterable
인터페이스를 implements
하고 있다면 그 클래스는 Iterator
를 사용할 수 있는 객체라고 볼 수 있습니다.
공식 문서에서 보시면
Iterable
인터페이스는 수많은 하위 인터페이스와 구현 클래스를 가지고 있음을 볼 수 있습니다.
사용법은 정말 간단합니다. Iterator를 사용할 수 있는 컬렉션에서 Iterator를 선언하기만 하면 바로 사용할 수 있습니다.
Iterator는 Collection 인터페이스에서 지원하고 있습니다. 따라서 Collection을 구현한 컬렉션 클래스만이 사용할 수 있습니다. (List와 Set 계열)
Iterator<E> 변수명 = 컬렉션.iterator(); //iterator 가져오기
다음은 Iterator
를 실제로 ArrayList
에서 사용하는 예제 코드입니다.
public class Main {
public static void main(String[] args) {
ArrayList<Integer> al = new ArrayList<Integer>(); //ArrayList 생성
al.add(1); //요소 삽입
al.add(2);
al.add(3);
al.add(4);
al.add(5);
System.out.println(al);
Iterator<Integer> iterator = al.iterator(); //Iterator 생성
while (iterator.hasNext()) { //ArrayList에서 가져올 객체가 더 없으면 반복 중지
Integer elem = iterator.next(); //next()로 객체 취득
System.out.println("현재 객체: " + elem);
if (elem == 5) {
iterator.remove(); //5 객체 삭제
}
}
System.out.println(al);
}
}
Iterator<Integer> iterator = al.iterator();
while (iterator.hasNext()) {
Integer elem = iterator.next();
}