본문 바로가기

기초 문법 알아보기 Java

컬렉션 프레임웍 Collection Framework : Iterator, ListIterator, Enumeration

728x90

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();
        }
    }
}