본문 바로가기
JAVA BASE/Collection(컬렉션) - 자료구조

06. [자바] Iterator, ListIterator, Enumeration

by staticClass 2021. 1. 4.

Iterator, ListIterator, Enumeration

Iterator, ListIterator, Enumeration 모두 다 컬렉션의 데이터에 접근하는데 사용되는 인터페이스이다.
Enumeration는 Iterator의 구버전이고 ListIterator는 Iterator의 기능을 향상 시킨 것이다.

순서대로 버전이 업그레이드 됐다고 생각하자
Enumeration → Iterator → ListIterator

Iterator

메서드설 명
boolean hasNext()읽어 올 노드가 남아있는지 확인한다. 있으면 true, 없으면 false를 반환한다.
Object next()다음 요소를 읽어 온다. next()를 호출하기 전에 hasNext()를 호출하는게 안전하다.
void remove()next()로 읽어온 요소를 삭제한다. 반드시 next()를 호출한 뒤에 remove()를 호출해야 한다.
(선택적 기능)
ArrayList al = new ArrayList();
al.iterator();

LinkedList ll = new LinkedList();
ll.iterator();

HashSet hs = new HashSet();
hs.iterator();

TreeSet ts = new TreeSet();
ts.iterator();
ArrayList al = new ArrayList();
Iterator it = al.iterator;

while(it.hasNext()){
    System.out.println(it.next());
}

컬렉션에 저장된 요소들을 읽어오는 방법을 Iterator로 표준화 하였다
List와 Set을 구현한 객체들은 모두 iterator를 이용할 수 있다.😎

Map의 Iterator

Map은 key와 value 한 쌍으로 이루어져 key를 이용해 value를 반환 받기 때문에

Iterator를 이용해서 Map객체의 데이터를 반환 받기 위해서는 Map을 Set으로 바꾸어야한다.

HashMap hm = new hashMap();
Iterator it = hm.entrySet().iterator();

ListIterator

일단 ListIterator는 ArrayList나 LinkedList 같이 List인터페이스를 구현한 컬렉션에만 사용이 가능하다.

이름 앞에 List가 붙어있으니 기억하기 쉬울 것이다.

ListIterator는 Iterator의 자식 클래스로 기능을 몇가지 추가해 주었다.

Iterator는 1 부터 2, 3, 4, 5, ... 쭉쭉쭉 한 방향으로만 기동이 가능하지만

ListIterator는 양방향으로 자유롭게 이동이 가능하다.

메소드설 명
void add(Object obj)컬렉션에 새로운 객체(obj)를 추가한다.
boolean hasNext()읽어 올 다음 노드가 남아있는지 확인한다. 있으면 true, 없으면 false를 반환한다.
boolean hasPrevious()읽어 올 이전 노드가 남아있는지 확인한다. 있으면 true, 없으면 false를 반환한다.
Object next()다음 요소를 읽어 온다. 메소드 실행 전에 hasNext()를 호출해서 읽어올 노드가 있는지
확인하는 것이 안전하다
Object previous()이전 요소를 읽어 온다. 메소드 실행 전에 hasPrevious()를 호출해서 읽어올 노드가 있는지
확인하는 것이 안전하다
int nextIndex()다음 요소의 index를 반환한다.
int previousIndex()이전 요소의 index를 반환한다.
void remove()next() 도는 previous()로 읽어온 요소를 삭제한다.
반드시 next() 또는 previous를 호출한 뒤에 remove()를 호출해야 한다.
(선택적 기능)
void set(Object obj)next() 또는 previous()로 읽어 온 요소를 지정된 객체(obj)로 변경한다.
반드시 next() 또는 previous()를 호출한 뒤에 set()을 호출해야 한다. (선택적 기능)
ArrayList al = new ArrayList();
al.add("A");
al.add("B");
al.add("C");
al.add("D");

ListIterator lt = al.listIterator();

while(lt.hasNext()) {
    System.out.print(lt.next());
}
System.out.println();
while(lt.hasPrevious()) {
    System.out.print(lt.previous());
}
ABCD
DCBA

Enumeration

그냥 이전버전으로 작성된 소스와의 호완을 위해 살려준 녀석이라 Enumeration 말고 Iterator를 쓰도록 하자
그래도 혹시 모르니 메서드는 적어둬야지 😊

메소드설 명
boolean hasMoreElements()읽어 올 노드가 남아있는지 확인한다. 있으면 true, 없으면 false를 반환한다.
Iterator의 hasNext()와 같은 기능이다.
Object nextElement()다음 요소를 읽어 온다. nextElement()를 호출하기 전에 hasMoreElements()를 호출하는게 안전하다.
Iterator의 next()와 같은 기능이다.

댓글