순회3 - 자바가 제공하는 Iterable, Iterator

2024. 6. 21. 16:02김영한 Java/컬렉션 프레임워크

  • 자바 컬렉션 프레임워크는 배열 리스트, 연결 리스트, 해시 셋, 연결 해시 셋, 트리 셋 등등 다양한 자료 구조를 제공한다.
  • 자바는 컬렉션 프레임워크를 사용하는 개발자가 편리하고 일관된 방법으로 자료 구조를 순회할 수 있도록 Iterable 인터페이스를 제공하고, 이미 각각의 구현체에 맞는 Iterator도 다 구현해두었다.
  • 자바 Collection 인터페이스의 상위에 Iterable이 있다는 것은 모든 컬렉션을 Iterable과 Iterator를 사용해서 순회할 수 있다는 뜻이다.
  • Map의 경우 Key뿐만 아니라 Value까지 있기 때문에 바로 순회를 할 수는 없다. 대신에 Key나 Value를 정해서 순회할 수 있는데, KeySet(), Values()를 호출하면 Set, Collection을 반환하기 때문에 Key나 Value를 정해서 순회할 수 있다. 물론 Entry를 Set구조로 번환하는 entrySet()도 순회가 가능하다.

 

정리하면 자바가 제공하는 컬렉션 프레임워크의  모든 자료 구조는 Iterable과 Iterator를 사용해서 편리하고 일관된 방법으로 순회할 수 있다. 물론 Iterable을 구현하기 때문에 향상된 for문도 사용할 수 있다.

 

package collection.iterable;

import java.util.*;

public class JavaIterableMain {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);

        Iterator<Integer> listIter = list.iterator();
        printAll(listIter);
        foreach(list);

        Set<Integer> set = new HashSet<>();
        set.add(1);
        set.add(2);
        set.add(3);
        Iterator<Integer> setIter = set.iterator();
        printAll(setIter);
        foreach(set);
    }


    private static void foreach(Iterable<Integer> list) {
        for(Integer i : list){
            System.out.println(i);
        }
    }

    private static void printAll(Iterator<Integer> iterator){
        System.out.println("iterator = " + iterator.getClass());
        while(iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }

}

 

실행 결과

iterator = class java.util.ArrayList$Itr
1
2
3
for-each
1
2
3
iterator = class java.util.HashMap$KeyIterator
1
2
3
for-each
1
2
3
  • Iterator, Iterable은 인터페이스이다. 따라서 다형성을 적극 활용할 수 있다. 
  • printAll(), forEach() 메서드는 새로운 자료 구조가 추가되어도 해당 자료 구조가 Iterator, Iterable만 구현하고 있다면 코드 변경 없이 사용할 수 있다.
  • java.util.ArrayList$Itr : ArrayList의 Iterator는 ArrayList의 중첩 클래스이다.
  • java.util.HashMap$KeyIterator : HashSet 자료 구조는 사실은 내부에서 HashMap 자료 구조를 사용한다. HashMap 자료 구조에서 value를 사용하지 않으면 HashSet과 같다.