[JAVA] Iterator, ListIterator, Enumeration
1. Iterator, ListIterator, Enumeration
- Iterator
컬렉션 프레임워크는 컬렉션에 저장된 요소들을 읽어오는 방법을 표준화하였다. 컬렉션에 저장된 각 요소에 접근하는 기능을 가진 Iterator 인터페이스를 정의하고, Collection 인터페이스에는 Iterator (Iterator 인터페이스를 구현한 클래스의 인스턴스) 를 반환하는 iterator() 를 정의하고 있다.
iterator() 는 Collection 인터페이스에 정의된 메서드이므로 List 와 Set 에도 포함되어 있다. iterator() 메서드를 호출하여 Iterator 를 반환받은 후에 반복문을 사용하여 요소들에 접근할 수 있다.
메서드 | 설명 |
boolean hasNext() | 읽어 올 요소가 남아있는지 여부를 반환한다. |
Object next() | 다음 요소를 읽어온다. |
void remove() | next() 로 읽어 온 요소를 삭제한다. |
List list = new ArrayList();
Iterator it = list.iterator();
while(it.haxNext()) {
System.out.println(it.next()); // list 에 값이 있는 경우 각 요소들이 순서대로 출력된다.
}
Map 인터페이스를 구현한 클래스는 key-value 형태로 저장되기 때문에 iterator() 를 직접 호출할 수 없고, keySet() 이나 entrySet() 과 같은 메서드를 통해서 key, value 를 각각 따로 Set 형태로 가져온 후 iterator() 를 호출하여 Iterator 를 얻을 수 있다.
- ListIterator, Enumeration
Enumeration 은 컬렉션 프레임워크가 만들어지기 이전에 사용하던 것으로 Iterator 의 구버전으로 생각하면 된다.
ListIterator 는 Iterator 를 상속받아서 기능을 추가한 것으로, 컬렉션 요소에 접근할 때 Iterator 는 단방향으로만 이동할 수 있는데 반해 ListIterator 는 양방향으로의 이동이 가능하다. 다만 ArrayList 나 LinkedList 와 같이 List 인터페이스를 구현한 컬렉션에서만 사용할 수 있다.
Enumeration 의 메서드는 다음과 같은 것들이 있다.
메서드 | 설명 |
boolean hasMoreElements() | 읽어 올 요소가 존재하는지 여부를 반환한다. Iterator 의 hasNext() 와 동일하다. |
Object nextElement() | 다음 요소를 읽어온다. Iterator 의 next() 와 동일하다. |
ListIterator 의 메서드는 다음과 같은 것들이 있다.
메서드 | 설명 |
void add(Object o) | 컬렉션에 새로운 객체, o를 추가한다. |
boolean hasNext() | 읽어 올 다음 요소가 있는지 여부를 반환한다. |
boolean hasPrevious() | 읽어 올 이전 요소가 있는지 여부를 반환한다. |
Object next() | 다음 요소를 읽어온다. |
Object previous() | 이전 요소를 읽어온다. |
int nextIndex() | 다음 요소의 index 를 반환한다. |
int previousIndex() | 이전 요소의 index 를 반환한다. |
void remove() | next() 또는 previous() 로 읽어 온 요소를 삭제한다. |
void set(Object o) | next() 또는 previous() 로 읽어 온 요소를 지정된 객체 o 로 변경한다. |
remove() 메서드의 경우 선택사항인데, 이는 클래스에서 해당 메서드를 반드시 구현하지 않아도 된다는 의미이다. java 에서는 Iterator 중 remove() 를 지원하지 않는 클래스의 경우 UnsupportedOperationException 을 발생시키도록 구현해놓았다.
remove() 의 경우 next() 또는 previous() 를 호출하여 읽어 온 요소를 삭제한다. 이들을 읽어올 때 index 를 저장하여서 마지막으로 읽어들인 요소의 index 를 보고 삭제를 수행한다. 만약 아무 요소도 호출하지 않고 remove() 를 호출하는 경우에는 IllegalStateException 이 발생한다.