iterator()
iterator() 메소드는 컬렉션 인스턴스에서 Iterator 객체를 가져오는 함수입니다.
Iterator 클래스를 사용하면 컬렉션을 반복할 수 있게 됩니다.
이 메소드는 모든 Collection 객체에 선언된 메소드는 아닙니다.
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class Main {
public static void main(String[] args) {
Set<Integer> set = new HashSet<>();
set.add(1);
set.add(2);
set.add(3);
Iterator<Integer> it = set.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
공식문서에 따르면 순서없는 컬렉션의 경우(ex. set) iterator의 순서는 보장하지 않는다고 합니다.
Set은 순서 없는 컬렉션이지만 위의 예제에서는 순서대로 출력하고 있습니다.
찾아본 결과, 순서를 보장하지 않는 경우가 있긴 합니다.
Map<String, String> map = new HashMap<>();
map.put("aaa", "111");
map.put("bbb", "222");
map.put("ccc", "333");
map.put("ddd", "444");
map.put("eee", "555");
map.put("fff", "666");
Iterator<String> keyIterator = map.keySet().iterator();
while (keyIterator.hasNext()) {
System.out.println(map.get(keyIterator.next()));
}
Set 자체는 순서를 보장하지 않는 컬렉션이지만, 위의 예제처럼 iterator를 사용했을 때 등록 순서대로 출력이 되는 것을 확인할 수가 있습니다.
Map은 keySet을 가져와서 iterator를 사용했을 때 등록된 순서대로 나오지 않습니다.
이유는 정확히 잘 모르겠지만, Map의 keySet의 iterator와 Set의 iterator는 내부에 구현된 로직이 다를 것으로 예상이 됩니다.
어쩌면 Set의 iterator도 순서를 보장하는 것처럼 보이지만 보장하지 않을 수도 있습니다.
그 외에 컬렉션 객체의 요소를 삭제할 때 iterator를 사용하여 삭제하면 for문과 for-loop문을 사용할 때 발생하는 오류를 예방할 수 있습니다.