Iterator, ListIterator, Enumeration은 모두 컬렉션에 저장된 요소를 접근하는데 사용되는 인터페이스이다. Enumeration은 Iterator의 구버젼이며, ListIterator는 Iterator의 기능을 향상시킨 것이다.
Iterator - 컬렉션에 저장된 요소를 접근하는데 사용되는 인터페이스
ListIterator - Iterator에 양방향 조회기능추가(list를 구현한 겨우만 사용가능)
Enumeration - Iterator의 구버전
컬렉션 프레임워크는 컬렉션에 저장된 요소들을 읽어오는 방법을 표준화 하였다. 컬렉션에 접근할 수 있는 Iterator인터페이스를 정의하고, Collection인터페이스에는 'Iterator를 구현한 클래스의 인스턴스'를 반환하는 iterator()메서드가 존재한다.
public interface Iterator {
boolean hasNext();
Object next();
void remove();
}
public interface Collection {
...
public Iterator iterator();
...
}
iterator()는 List와 Set에도 있으며 List나 Set인터페이스를 구현하는 컬렉션 클래스들은 iterator()가 각 컬렉션의 특징에 알맞게 작성돼 있다. 컬렉션 클래스에 대해 iterator()를 사용해 Iterator객체를 얻은 다음 반복문을 사용하여 컬렉션 클래스의 요소들을 읽어올 수 있다.
List list = new ArrayList();
iterator it = list.iterator();
while(it.hasNext()) { // boolean hasNext() 요소가 남아있는지 확인
System.out.println(it.next()); // Object next() 다음 요소를 가져 옴.
}
import java.util.*;
public class IteratorExample {
public static void main(String[] args) {
List list = new ArrayList();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
Iterator it = list.iterator();
while (it.hasNext()) {
Object o = it.next();
System.out.println(o);
}
}
}
List클래스들은 저장순서를 유지하기에 Iterator를 이용해 읽어 온 결과 역시 저장순서와 동일하지만 Set클래스들은 처음에 저장된 순서와 같지 않음을 유의하자. List클래스들은 Iterator대신 아래의 코드와 같이 for문과 get()만으로도 모든 요소들을 출력 가능하다.
for(int i = 0; i < list.size(); i++) {
Object obj = list.get(i);
System.out.println(obj);
}
Map인터페이스를 구현한 클래스는 키와 값을 쌍으로 저장하기에 iterator()를 직접 호출할 수 없고, 그 대신 keySet()이나 entrySet()과 같은 메서드를 통해 키와 값을 각각 따로Set의 형태로 얻어 온 후 다시 iterator()를 호출해야 Iterator를 얻을 수 있다.
Map map = new HashMap();
...
Iterator it = map.entrySet().iterator();
Iterator it = map.entrySet().iterator(); 는 아래의 두 문장을 하나로 합친 것이라고 이해하면 된다.
Set eSet = map.entrySet();
Iterator it = eSet.iterator();