본문 바로가기
Java

Iterator란? Iterator 사용하는 이유 & 사용법

by asdft 2024. 2. 16.

Iterator란?

- iterator는 ArrayList, HashSet과 같은 컬렉션을 반복하는 데 사용할 수 있는 객체다.
- Vector<E>, ArrayList<E>, LinkedList<E>가 상속받는 인터페이스이다
- iterator( )를 호출하면 Iterator 객체 반환
- 자바의 컬렉션에 저장되어 있는 요소들을 읽어오는 방법의 인터페이스이다.
- 순서가 있는 List 인터페이스의 경우는 Iterator를 사용하지 않고 get( ) 메소드 활용 가능.
- Set 인터페이스의 경우 get( ) 메소드가 제공되지 않으므로 Iterator를 활용하여 객체를 순회

 

 

근데, 컬렉션을 반복하고 그 안의 데이터에 접근하기 위해서라면 for, while 같은 반복문을 써서도 충분히 가능하다.

그렇다면 iterator는 왜 만들어진 걸까?

자료구조 중 Set의 경우 인덱스가 없기 때문에 일반 for문을 사용할 수 없지만,
for-each문과 Iterator는 사용할 수 있다.

그러나 for-each문으로 자료구조를 돌다가 값을 수정, 삭제해야 해서 수정, 삭제를 수행하는 코드를 넣으면 ConcurrentModificationException이 발생한다.
Iterator를 이용한 값의 수정은 가능.

성능 부분에선 Iterator의 경우 객체를 가져오는 과정이 있다보니, for문과 While 문 보다는 수행속도가 느리지만,
Iterator의 장점인 Index를 관리해준다는 편의성이 있어 적절히 사용하면 유용할 것이다.

선언

Iterator<클래스 타입> iterator명 = 컬렉션.iterator( )

 

ex)     HashMap<String,Integer> wear = new HashMap<String,Integer>();

           Iterator<Integer> iterator = wear.values().iterator();

 

Iterator의 장점

1. 모든 컬렉션 프레임워크에 공통으로 사용 가능
2. next() 및 previous()를 써서 앞뒤로 이동하는 기능
3. hasNext()를 써서 더 많은 요소가 있는지 확인하는 기능

 

Iterator의 단점

1. 처음부터 끝까지의 단방향 반복만 가능
2. 값의 변경이나 추가 불가능
3. 대량의 데이터를 제어할 시 느린 속도

 

Iterator method

(1) hasNext( ) : 다음 요소에 읽어 올 요소가 있는지 확인하는 메소드. 있으면 True, 없으면 false를 반환
(2) next( ) : 다음 요소를 가져온다.
(3) remove( ) : next( )로 읽어온 요소를 삭제한다.   (반드시 next( ) 후에 사용해야 함.)

 


참고) iterator를 이용해 값을 수정하는 예제

import java.util.ArrayList;
import java.util.ListIterator;

public class Main
{
    public static void main(String[] args)
    {
        // 컬렉션 생성
        ArrayList<String> list = new ArrayList<>();
        list.add("A");
        list.add("B");
        list.add("C");
        list.add("D");
        list.add("E");
        list.add("F");
        System.out.println("while문 지나기 전 리스트에 들어있던 값 : " + list);

        // 리스트에 들어있는 값에 각각 '+' 붙이기
        ListIterator<String> listIterator = list.listIterator();
        while(listIterator.hasNext())
        {
            Object element = listIterator.next();
            listIterator.set(element + "+");
        }
        System.out.println("while문 지난 후 수정된 결과 : " + list);

        // 리스트에 들어있는 값을 역순으로 표시
        System.out.print("역순 출력 결과 : ");
        while(listIterator.hasPrevious())
        {
            Object element = listIterator.previous();
            System.out.print(element + " ");
        }
        System.out.println();
    }

}
// >> while문 지나기 전 리스트에 들어있던 값 : [A, B, C, D, E, F]
// >> while문 지난 후 수정된 결과 : [A+, B+, C+, D+, E+, F+]
// >> 역순 출력 결과 : F+ E+ D+ C+ B+ A+

 

 

 

[참조]

https://onlyfor-me-blog.tistory.com/319