Iterator 정리

이민우·2023년 7월 23일
1

JAVA

목록 보기
1/1

iterator는 ArrayList, HashSet과 같은 컬렉션을 반복하는 데 사용할 수 있는 객체다. iterator는 반복의 기술 용어기 때문에 반복자라고 한다

iterator 인터페이스 내부를 확인해봅시다.내부를 확인해보면 4개의 함수가 있습니다.

  • hasNext()
    -iteration에 다음 요소가 존재하는지의 여부를 boolean으로 반환
  • next()
    • 해당 iterator에서 다음 요소를 반환합니다.
  • remove()
    • iteration에서 반환된 마지막 요소를 내부 컬렉션에서 제거하는 역할을 합니다. next()호출마다 한번만 호출 가능하며, 반복이 진행되는 동안 이것 이외의 방법으로 컬렉션이 수정되면 동작이 지정되지 않는다고 설명하고 있습니다.
  • forEachRemaining
    • 모든 요소가 처리되거나 적업에서 예외가 발생할 때까지 남은 각 요소에 대해 지정된 작업을 수행합니다.

궁금점


결국 iterator도 데이터에 접근하기 위해서 있는건데, for while 같은 반복문을 써도 충분히 가능할텐데, 왜 만들어진걸까!

iterator vs for문(링크 참조)

정리

리스트에는 인덱스가 있지만 Set은 순서가 없는(unordered) 컬렉션이기 때문에 인덱스가 없다. iterator는 for-each 반복문이 할 수 없는 일을 할 수 있다. 예를 들어 iterator가 지원하는 경우 반복하는 동안 요소를 제거할 수 있다. 리스트는 또한 양방향으로 반복할 수 있는 iterator를 제공한다. for-each 반복문은 처음부터 끝까지만 반복된다. 인덱스를 사용해 요소에 접근하는 것은 배열로 지원되는 컬렉션에서 약간 더 효율적이다.
그러나 ArrayList 대신 LinkedList를 사용하면 list.get(i)에 액세스할 때마다 연결된 리스트가 i번째 요소까지 모든 요소를 반복해야 하기 때문에 성능이 나빠질 것이다. iterator(따라서 for-each 루프)에는 이 문제가 없다. 컬렉션 자체에 iterator 구현이 있기 때문에 항상 주어진 컬렉션의 요소를 반복하는 가장 좋은 방법을 사용한다

Iterator의 장점

  1. 컬렉션에서 요소를 제어하는 기능
  2. next() 및 previous()를 써서 앞뒤로 이동하는 기능
  3. hasNext()를 써서 더 많은 요소가 있는지 확인하는 기능

사용예시

import java.util.ArrayList;
import java.util.Iterator;

public class Main
{
    public static void main(String[] args)
    {
        // 컬렉션 생성
        ArrayList<String> cars = new ArrayList<>();
        cars.add("벤츠");
        cars.add("람보르기니");
        cars.add("롤스로이스");
        cars.add("페라리");

        // iterator 획득
        Iterator<String> iterator = cars.iterator();

        // while문을 사용한 경우
        while(iterator.hasNext())
        {
            String str = iterator.next();
            System.out.println(str);
        }

        // for-each문을 사용한 경우
        for (String str : cars)
        {
            System.out.println(str);
        }
    }

}

Iterator.forEachRemaining

List<String> fieldNameList = new ArrayList<>();
fieldNameIterator.forEachRemaining(fieldNameList::add);

Java 8 혹은 그 이상의 버전에서는 iterator 타입의 forEachRemaining 메소드를 활용하면 List를 채울 수 있다. forEachRemaining 메소드의 참조로 add() 메소드를 전달하면 해당 iterator 인스턴스의 제네릭 타입의 value를 add하게 된다.

profile
백엔드 공부중입니다!

0개의 댓글