본문 바로가기

프로그래밍/자바(java)

[자바/java] Enumeration, Iterator, ListIterator

Enumeration, Iterator, ListIterator 모두 컬렉션에 저장된 요소를 접근하는데 사용되는 인터페이스이다.

Enumeration은 Iterator의 구버전이며, ListIterator는 Iterator의 기능을 향상 시킨 것이다.

 

Iterator

 

컬렉션 프레임워크에서는 컬렉션에 저장된 요소들을 읽어오는 방법을 표준화 하였습니다.

컬렉션에 저장된 각 요소에 접근하는 기능을 가진 Iterator 인터페이스를 정의하고, Collection 인터페이스에서는 Iterator를 반환하는 iterator()를 정의하고 있습니다.

 

List나 Set인터페이스를 구현하는 컬렉션은 iterator()가 컬렉션의 특징에 알맞게 작성되어 있다.

 

 

ArrayList에 저장된 요소들을 출력하기 위한 코드는 다음과 같이 작성할 수 있다.

 

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class IteratorExample {

    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();

        list.add("부부의 세계");
        list.add("SKY 캐슬");
        list.add("호텔 델루나");

        Iterator<String> it = list.iterator();
        while(it.hasNext()) {
            System.out.println(it.next());
        }
    }

}

 

 

 

 

Map인터페이스를 구현한 컬렉션 클래스는 키(key)와 값(value)을 쌍으로 저장하고 있기 때문에 iterator()를 직접 호출할 수 없고, 그 대신 keySet()이나 entrySet()과 같은 메서드를 통해서 키와 값을 각각 따로 Set의 형태로 얻어 온 후에 다시 iterator()를 호출해야 Iterator를 얻을 수 있다.

 

Map map = new HashMap();

Iterator it = map.keySet().iterator();

 

entrySet() 을 쓰는 경우에는 다음과 같이 작성하면 됩니다.

 

Map map = new HashMap();

Set set = map.entrySet();
Iterator list = set.iterator();

 

여기서 주의 해야 할 점은 list 클래스들은 저장순서를 유지하기 때문에 Iterator를 이용해서 읽어 온 결과 역시 저장순서와 동일하지만 Set클래스들은 각 요소간의 순서가 유지 되지 않기 때문에 Iterator를 이용해서 저장된 요소들을 읽어 와도 처음에 저장된 순서와 같지 않습니다.

 

 

ListIterator

 

Enumeration은 컬렉션 프레임워크가 만들어지기 이전에 사용하던 것으로 Iterator의 구버전이라고 생각하면 된다. 이전 버전으로 작성된 소스와의 호환을 위해서 남겨 두고 있을뿐이므로 가능하면 Enumeration 대신 Iterator를 사용하면 됩니다.

 

ListIterator는 Iterator를 상속받아서 기능을 추가한 것으로, 컬렉션의 요소에 접근할 때 Iterator는 단방향으로만 이동할 수 있는 데 반해 ListIterator는 양방향으로의 이동이 가능합니다.

 

 

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

public class ListIteratorExample {

    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();

        list.add("부부의 세계");
        list.add("SKY 캐슬");
        list.add("호텔 델루나");

        ListIterator<String> it = list.listIterator();

        while(it.hasNext()) {
            System.out.print(it.next() + ",");
        }

        System.out.println();

        while(it.hasPrevious()) {
            System.out.print(it.previous() + ",");
        }

    }

}

 

 

 

ListIterator의 사용방법을 보여주는 간단한 예제입니다, iterator는 단방향만 이동하기 때문에 컬렉션의 마지막 요소에 다다르면 더 이상 사용할 수 없지만, ListIterator는 양방향으로 이동하기 때문에 각 요소간의 이동이 자유롭다. 다만 이동하기 전에 반드시 hasNext() 나 hasPrevious() 호출해서 이동할 수 있는지 확인을 해야 합니다.