Iterator, ListIterator, Enumeration은 컬렉션에 저장된 요소를 접근하는데 사용되는 인터페이스이다.
Enumeration은 Iterator의 구버젼이며, ListIterator은 Iterator의 기능을 향상 시킨 것이다.
Iterator
컬렉션에 저장된 요소들을 읽어오는 방법을 표준화하였다. 저장된 각 요소에 접근하는 기능을 가진 Iterator 인터페이스를 정의하고, Collection 인터페이스에는 Iteratro를 반환하는 iterator() 메서드를 정의하였다.
public interface Iterator{
boolean hasNext(); // 읽어 올 요소가 남아있는지 확인한다.
Object next(); // 다음 요소를 읽어 온다.
void remove(); // next()로 읽어 온 요소를 삭제한다.
}
public interface Collection{
...
public Iterator iterator();
...
}
ArrayList에 저장된 요소들을 출력하기 위한 코드는 다음과 같다.
List list = new ArrayList();
Iterator it = list.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
Map인터페이스를 구현한 컬렉션 클래스는 키와 값 쌍으로 저장하고 있기 떄문에 iterator()를 직접 호출이 안되고, keySet(), entrySet()과 같은 메서드를 통해서 키와 값을 각각 따로 Set의 형태로 얻어 온후 다시 iterator()를 호출해야한다.
Map map = new HashMap();
...
Iterator it = map.keySet().iterator();
Set eSet = map.entrySet();
Iterator list = eset.iterator(); // map.entyrSet으로 얻은 Set인터페이스의 iterator()를 호출해서 Iterator 인스턴스를 얻는다. 마지막으로 Iterator 인스턴스의 참조가 list에 저장된다.
ListIterator
ListIterator은 Iterator를 상속받아서 기능을 추가하였다. Iterator은 단방향으로만 이동할 수 있는데, ListIterator는 양방향으로 이동이 가능하다. 다만 List 인터페이스를 구현한 컬렉션에서만 사용할 수 있다.
import java.io.*;
class ListIteratorEx1{
public static void main(String[] args){
ArrayList list = new ArrayList();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
ListIterator it = list.listIterator();
while(it.hasNext()){
System.out.print(it.next()); // 12345
}
while(it.hasPrevious()){
System.out.print(it.previous()); // 54321
}
}
}
선택적 기능 메서드는 반드시 구현하지 않아도 된다. 그렇다하더라도 인터페이스로부터 상속받은 메서드는 추상메서드라 메서드의 몸통을 반드시 만들어 주어야하므로 다음과 같이 처리한다.
public void remove(){
throw new UnsupportedOperationException();
}
remove()는 단독으로 쓰일 수 없고, next()와 같이 써야한다. 특정위치의 요소를 삭제하는 것이 아니라 읽어 온 것을 삭제한다.
import java.util.*;
public class IteratorEx2{
public static void main(String[] args){
ArrayList origianl = new ArrayList(10);
ArrayList copy1 = new ArrayList(10);
ArrayList copy2 = new ArrayList(10);
for(int i=0;i<10;i++){
origianl.add()
}
Iterator it = new original.iterator();
while(it.hasNext()){
copy1.add(it.next());
}
it = origianl.iterator(); //Iterator는 재사용이 안되므로, 다시 얻어와야 한다.
while(it.hasNext()){
copy2.add(it.next());
it.remove();
}
}
}
'기초 문법 알아보기 Java' 카테고리의 다른 글
컬렉션 프레임웍 Collection Framework : HashSet (0) | 2024.04.29 |
---|---|
컬렉션 프레임웍 Collection Framework : Arrays (0) | 2024.04.15 |
컬렉션 프레임웍 Collection Framework : Stack, Queue (0) | 2024.04.06 |
컬렉션 프레임웍 Collection Framework : ArrayList, LinkedList (0) | 2024.04.05 |
컬렉션 프레임웍 Collection Framework : 핵심 인터페이스 (0) | 2024.04.05 |