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()와 같은 기능이다. |
댓글