[Java/자바] Iterator, Listlterator 클래스 사용법

Iterator

iterator()는 Collection 인터페이스에 정의된 메서드로, Collection 인터페이스의 자손인 List와 Set에도 포함되어 있습니다.

그래서 List나 Set인터페이스를 구현하는 컬렉션은 iterator()가 각 컬렉션의 특징에 맞게 포함되어 있습니다.

 

Map 인터페이스를 구현한 클래스의 경우에는 key - value 쌍으로 저장하기 때문에 iterator()를 직접호출 할 수 없고,

keySet()이나 entrySet() 메서드를 통해 키와 값을 Set형태로 얻은 뒤 iterator()를 호출할 수 있습니다.

Map map = new HashMap();

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

 

iterator() 메서드는 반복문, 주로 while문을 사용해 컬렉션 클래스의 요소들을 읽어 오는데 사용합니다.

 

Iterator 메서드
메서드 반환 타입 설 명
hasNext() boolean 읽어 올 요소가 남아있는지 확인
next() Object 다음 요소를 읽어 온다.
[ next()를 호출하기 전, hasNext()를 호출해 읽어올 요소가 있는지 확인해야한다. ]
remove() void next()로 읽어 온 요소를 삭제한다.
[ next()를 호출한 다음에 remove()를 호출해야 한다. ]

 

Iterator 예제

list에 포함된 요소들을 iterator()를 통해 순차적으로 읽어오기
import java.util.*;

class IteratorEx1 {
	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");

		Iterator it = list.iterator();
		while(it.hasNext()) {
			Object obj = it.next();
			System.out.println(obj);
		}
	}
}

 

Itorator로 요소 복사 및 이동하기
import java.util.*;

public class IteratorEx2 {
	public static void main(String[] args) {
		ArrayList original = new ArrayList(10);
		ArrayList copy1    = new ArrayList(10);		
		ArrayList copy2    = new ArrayList(10);		
		
		for(int i=0; i < 10; i++)
			original.add(i+"");

		Iterator it = original.iterator();
		
		while(it.hasNext()) {
			copy1.add(it.next());
		}
			
		System.out.println("= Original에서 copy1로 복사(copy) =");		
		System.out.println("original:"+original);
		System.out.println("copy1:"+copy1);
		System.out.println();

		it = original.iterator(); // Iterator는 재사용이 안되므로, 다시 얻어와야 한다.
		
		while(it.hasNext()){
			copy2.add(it.next());
			it.remove();
		}
		
		System.out.println("= Original에서 copy2로 이동(move) =");		
		System.out.println("original:"+original);
		System.out.println("copy2:"+copy2);		
	}
}

 


ListIterator

ListIterator는 Iterator를 상속받아 양방향 기능을 추가한 것입니다.

다만, ArrayList나 LinkedList와 같이 List 인터페이스를 구현한 컬렉션에서만 사용 가능합니다.

 

ListIterator의 메서드
메서드 반환 타입 void설명
add(Object o) void 컬렉션에 새로운 객체(o)를 추가한다.
hasNext() boolean 읽어 올 다음 요소가 남아있는지 확인
hasPrevious() boolean 읽어 올 이전 요소가 남아있는지 확인
next() Object 다음 요소를 읽어온다.
[ next()를 호출하기 전, hasNext()를 호출해 읽어올 요소가 있는지 확인해야한다. ]
previous() Object 이전 요소를 읽어온다.
[ previous()를 호출하기 전, hasPrevious()를 호출해 읽어올 요소가 있는지 확인해야한다. ]
nexIndex() int 다음 요소의 index를 반환
previousIndex() int 이전 요소의 index를 반환
remove() void next() 또는 previous()로 읽어 온 요소를 삭제한다.
[ 반드시 next()나 previous()를 먼저 호출한 다음 이 메서드를 호출해야 한다. ]
set(Object o) void next() 또는 previous()로 읽어 온 요소를 지정된 객체(o)로 변경한다.
[ 반드시 next()나 previous()를 먼저 호출한 다음 이 메서드를 호출해야 한다. ]

 

 

ListItorator 예제

import java.util.*;

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

		System.out.println("순방향으로 진행");
		while(it.hasNext()) {
			System.out.print(it.next()); // 순방향으로 진행하면서 읽어온다.
		}
		System.out.println();
		System.out.println("-------------------");

		System.out.println("역방향으로 진행");
		while(it.hasPrevious()) {
			System.out.print(it.previous()); // 역방향으로 진행하면서 읽어온다.
		}
	}
}

 


참고자료
자바의 정석3