컬렉션에 저장된 각 요소에 접근하는 기능을 가진 Iterator
인터페이스를 정의하고, Collection
인터페이스에는 Iterator(Iterator를 구현한 클래스의 인스턴스)
를 반환하는 iterator()
를 정의하고 있다.
iterator()
는 Collection
인터페이스에 정의된 메서드이므로 Collection
인터페이스의 하위 인터페이스인 List
와 Set
에도 포함되어 있으며, 각 컬렉션의 특징에 알맞게 작성되어 있다.
List list = new ArrayList();
Iterator it = list.iterator();
// 다음 요소가 있는지?
while(it.hasNext()) {
System.out.println(it.next()); // 다음 요소를 읽어온다
it.remove(); // 읽어 온 요소를 삭제한다
}
Map 인터페이스를 구현한 컬렉션 클래스는 키(key)와 값(value)을 쌍(pair)으로 저장하고 있기 때문에
iterator()
를 직접 호출할 수 없다.
그 대신keySet()
이나entrySet()
과 같은 메서드를 통해서 키와 값을 각각 따로 Set의 형태로 얻어 온 후에 다시iterator()
를 호출해야 Iterator를 호출해야 Iterator를 얻을 수 있다.
Iterator
를 상속받아서 기능을 추가한 것으로 Iterator
는 단방향으로만 이동할 수 있는데 반해 ListIterator
는 양방향으로의 이동이 가능하다.
ArrayList, LinkedList와 같이 List인터페이스를 구현한 컬렉션에서만 사용할 수 있다.
/**
* 1. 작성자 : Dani
* 2. 작성일 : 12월 10일
* 3. Iterator 기본 문법
*/
package Basics;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.ListIterator;
public class IteratorEx1 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("이름1");
list.add("이름2");
list.add("이름3");
list.add("이름4");
/**
* 요소 불러오기
* 재사용X
*/
/*
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()){ // 다음 요소가 있는지?
System.out.println(iterator.next()); // 다음요소 읽어오기
iterator.remove(); // 요소 삭제
}
System.out.println("요소의 개수 : " + list.size()); // 0 전부 삭제 됐다.
*/
/**
* Iterator의 향상된 버전
* 양방향으로 조회 가능
* List 인터페이스를 구현한 컬렉션 클래스
*/
ListIterator<String> stringListIterator = list.listIterator();
while (stringListIterator.hasNext()){
System.out.println(stringListIterator.next());
}
while (stringListIterator.hasPrevious()){
System.out.println(stringListIterator.previous());
}
}
}
이름1
이름2
이름3
이름4
이름4
이름3
이름2
이름1
컬렉션 프레임워크가 만들어지기 이전에 사용하던 것으로 Iterator의 구버전이다.
이전 버전으로 작성된 소스와의 호환을 위해 남겨둔 것
// 다음 요소가 있는지?
while(it.hasMoreElements()()) {
System.out.println(it.nextElement()); // 다음 요소를 읽어온다
}
package Iterator;
import java.util.ArrayList;
import java.util.Iterator;
public class IteratorEx {
public static void main(String[] args) {
ArrayList orginal = new ArrayList<>(10);
ArrayList copy1 = new ArrayList<>(10);
ArrayList copy2 = new ArrayList<>(10);
for (int i=0; i<10; i++){
orginal.add(i);
}
Iterator iterator = orginal.iterator();
while (iterator.hasNext()){
copy1.add(iterator.next());
}
System.out.println("==original -> copy1 복사==");
System.out.println("original : " + orginal);
System.out.println("copy1 : " + copy1);
System.out.println();
iterator = orginal.iterator(); // 재사용이 안되므로 다시 얻어와야 함
while (iterator.hasNext()){
copy2.add(iterator.next());
iterator.remove();
}
System.out.println("==original -> copy2 복사==");
System.out.println("copy1 : " + copy1);
System.out.println("original : " + orginal);
System.out.println();
}
}
==original -> copy1 복사==
original : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
copy1 : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
==original -> copy2 복사==
copy1 : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
original : []