반응형
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
'◼ JAVA' 카테고리의 다른 글
[Java/자바] Comparator와 Comparable (1) | 2022.10.31 |
---|---|
[Java/자바] Collections 클래스 (0) | 2022.10.31 |
[Java/자바] LinkedList 클래스 사용법 (0) | 2022.10.30 |
[Java/자바] ArrayList 클래스 사용법 (0) | 2022.10.30 |
[Java/자바] 컬렉션 프레임워크(Collections Framework) (2) | 2022.10.28 |