백엔드 개발자라면 대답해야 할 100가지 질문

12. Iterator란 무엇인가?

ignuy 2023. 8. 8.

 

List<Integer> list = new LinkedList<>();
Iterator<Integer> iterList = list.iterator();

자바에서 Iterator는 Collection Framework의 값을 조회, 삭제할 때 사용한다. 위와 같은 방식으로 Iterator <T> 참조변수 = 컬렉션.iterator();로 선언하여 사용한다.

Iterator Interface

public interface Iterator<E> {

    boolean hasNext();

    E next();

    default void remove() {
        throw new UnsupportedOperationException("remove");
    }

    default void forEachRemaining(Consumer<? super E> action) {
        Objects.requireNonNull(action);
        while (hasNext()
            action.accept(next());
    }
}

메소드는 총 네 가지이다.

  • boolean hasNext();
    • 다음 값이 들어있는지 확인한다. 다음 값이 있으면 true를, 없으면 false를 반환한다.
  • E next();
    • iterator의 다음 값을 반환한다.
    • 다음 값이 없다면 NoSuchElementException 예외를 던진다.
  • void remove();
    • next() 시에 가져온 값을 컬렉션에서 삭제한다.
    • 삭제할 수 없는 상황이라면 UnsupportedOperationException 예외를 던진다.
    • 반드시 next() 후에 사용해야 한다. 원칙을 지키지 않으면 IllegalStateException예외를 던진다.
  • void forEachRemaining(Consumer< ? super E> action)
    • 모든 요소가 처리되거나 예외를 던질 때까지 각 나머지 요소에 대한 지정된 작업을 수행한다.

장점

컬렉션을 모두 순회하면서 get() 메서드를 사용하면 값을 가져오는 것은 물론 추가적인 연산을 수행할 수 있을 텐데 굳이 Iterator를 따로 사용해야 하는 이유가 있을까?

Iterator는 모든 Collection Framework가 공통으로 사용할 수 있는 인터페이스이므로 유지보수 측면에서 상당한 유연성을 가지고 있다. 기존 컬렉션 클래스를 다른 컬렉션 클래스로 변경하는 경우 지원하는 메서드가 다르면 수정하는 부분이 많아질 수 있다. 그때마다 다른 방법으로 구현할 필요 없이 범용적으로 구현된 Iterator를 사용하면 값을 쉽게 가져오고 제거할 수 있다.

단점

하지만, 순회는 무조건 단방향으로 반복만 가능하고 값을 변경하거나 추가하는 연산이 불가능하다. 또한 인터페이스 구조상 List 데이터를 받아 새로운 구조로 다시 만들기 때문에 Collection Class에서 제공하는 size를 통해 반복문으로 데이터에 접근하는 것보다 느리다.

댓글