[JAVA] Iterator의 개념 및 사용 이유

Yuri Lee·2023년 5월 15일
1

JAVA

목록 보기
2/16
post-custom-banner

Iterator란?

Iterator란 자바의 컬렉션에 저장되어 있는 요소들을 순회하는 인터페이스이다.

Collection이란?

Collection이란 자바에서 제공하는 자료구조들의 인터페이스로 List, ArrayList, Stack, Quque, LinkedList 등이 이를 상속받고 있다. 즉, 이러한 컬렉션 인터페이스를 상속받는 클래스들에 대해 Iterator 인터페이스 사용이 가능하다.

Iterator를 왜 사용하는가?

컬렉션 프레임워크에 대해 공통으로 사용이 가능하고, 사용법이 간단하기 때문이다.

Iterator 정의방법

Iterator의 정의방법은 다음과 같다.

Iterator<T> iterator = Collection.iterator();

Iterator 메서드

Iterator를 사용하려면 3가지 메서드만 알면 된다.

  • hasnext() : 다음 요소가 있는지 판단
  • next() : 다음 요소를 가져옴
  • remove() : 가져온 요소를 삭제
public class IteratorTest{
	public static void main(String[] args) {
		List<Integer> list = new ArrayList<Integer>();
        
        //Collection 인터페이스를 상속받는 ArrayList 객체를 생성하고 0부터 100 값을 add 한다.
        for(int i=0; i<=100; i++){
        	list.add(i);
        } 
        
        Iterator<Integer> iter = list.iterator(); //ArrayList 객체를 Iterator 인터페이스 객체를 참조하여 값을 저장한다.
        
        while(iter.hasNext()){ 
        	int data = iter.next(); 
            System.out.print(data);
        }
    }
}

Iterator와 반복문

Iterator를 통한 순회는 반복문을 통한 순회와는 메모리적으로 중요한 차이가 있다.
LinkedList를 통해 예를 들어보겠다.

public void linkedListTest(){
	LinkedList<Integer> list = new LinkedList<Integer>();
    
    for(int i=0; i<=100; i++){
    	list.add(i);
    }
    
    for(int i=0; i<=100; i++){
    	list.get(i);
    }
}

add 메서드를 이용해 데이터 입력이 다 끝나면 위 그림과 같은 구조가 된다. 그리고 get(0)부터 get(100)까지를 수행하게 되는데 이는 0부터 100까지 총 101번의 요소를 조회하는게 아니다. get(int index) 메서드는 시작 주소부터 index 만큼 요소들을 밟아가며 조회하는 메서드이기 때문이다. 만약 5번째 값을 조회한다면 처음 시작주소부터 시작하여 다음 주소를 타고, 타고, 같은 동작을 5번 반복해야한다. get 메서드가 실행되며 i 값이 증가할 때마다 메모리적으로 조회해야하는 요소는 1번, 2번, 3번, 4번...101번까지 증가하는 것이다. 총 5151번을 조회해야한다.

이에 반해 iterator는 1부터 101번째까지의 요소에 대해 내부적으로 객체를 생성한 후 순차적으로 조회한다. 처음 주소로 돌아갈 필요가 없기 때문에 next 메서드를 통해 조회 시 요소의 개수인 101번만 조회를 하게된다.

그렇다면 속도면에서 훨씬 빠를까?

훨씬 빠를 것이라고 생각했으나, iterator를 구현하기 위해 객체를 생성하는 부분에서 시간이 더 걸린다고 한다.

결론은, Iterator는 컬렉션 프레임워크에 대한 인터페이스이고, 사용법이 쉽다. 그러나 반복문보다 속도면에서 조금 느리다는 평이 있다.

REFERENCES

https://tlatmsrud.tistory.com/61

profile
유리
post-custom-banner

0개의 댓글