✔️ 컬렉션에 저장된 데이터를 접근하는데 사용되는 인터페이스
public interface Collection {
...
public Iterator iterator();
...
}
Collection의 List / Set / Map 등등 구조가 다 다르다.
하지만 Iterator
와 Enumeration
은 이들의 구조가 어떻든 간에 표준화하며 확인하고 읽어온다.
// 다른 Collection으로 변경할 때는 첫줄 부분만 고치면 된다.
List list = new ArrayList();
Iterator it = list.iterator();
while(it.hasNext()) { // 읽어올 요소가 있는지 확인
System.out.println(it.next()); // 다음 요소를 읽어옴
}
✏️ boolean hasNext()
- 읽어 올 요소가 남아있는지 확인한다.
- 있으면 true, 없으면 false를 반환한다.
✏️ Object next()
- 다음 요소를 읽어온다.
- next()를 호출하기 전에 hasNext()를 호출해서 읽어 올 요소가 있는지 확인하는 것이 안전하다.
Collection의 요소들을 읽어올 수 있을 때까지 계속 돈다.
읽어올 것이 없으면 false가 돼서 멈춘다.
✏️ boolean hasMoreElements()
- 읽어 올 요소가 남아있는지 확인한다.
- 있으면 true, 없으면 false를 반환한다.
- Iterator의 hasNext()와 같다.
✏️ Object nextElement()
- 다음 요소를 읽어온다.
- nextElement()를 호출하기 전에 hasMoreElements()를 호출해서 읽어 올 요소가 있는지 확인하는 것이 안전하다.
- Iterator의 next()와 같다.
Enumeration은 구버전이기 때문에 신버전인 Iterator를 더 많이 쓰고 지향한다.
import java.util.ArrayList;
import java.util.Iterator;
public class IteratorTest {
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()) {
System.out.println(it.next());
}
// 1회용
it = list.iterator(); // 새로운 iterator를 얻는다.
while(it.hasNext()) {
System.out.println(it.next());
}
}
}
Iterator는 1회용이기 때문에 한번 더 출력할려면 Iterator를 다시 얻어와야 한다.
for(int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
반복문을 사용해서 읽어오면 되지 왜 Iterator
를 사용하는걸까?
예제를 좀 바꾸어서 ArrayList
를 HashSet
으로 바꿔보겠다.
import java.util.HashSet;
import java.util.Iterator;
public class IteratorTest {
public static void main(String[] args) {
HashSet list = new HashSet(); // Set은 Collection의 자손
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
Iterator it = list.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
for(int i = 0; i < list.size(); i++) {
// HashSet은 get()가 없다. 그래서 동작하지 않는다.
System.out.println(list.get(i)); // Error
}
}
}
HashSet
은 get()
이 없어서 반복문으로 읽어오기에는 한계가 있다.
Iterator
는 Collection에 지정된 데이터를 접근가능하기 때문에 HashSet
도 읽어오기 가능하다.
❌ Map에는
iterator()
가 없다.
Map은 Collection의 자손이 아니기 때문에, iterator()가 없다.
✔️
keySet()
,entrySet()
,values()
를 호출하여 iterator를 불러옴
keySet()
, entrySet()
: Set
values()
: Collection
Map map = new HashMap();
Set eSet = map.entrySet();
Iterator it = eSet.iterator();
// Iterator it = map.entrySet().iterator();
References
: https://cafe.naver.com/javachobostudy