본문 바로가기

자바

[JAVA] 반복자 Iterator을 사용해 컬렉션(List, Set, Map) 순회하기

728x90

Iterator에 대한 Java Oracle 문서에 정의된 내용은 아래와 같다.

An iterator over a collection. An iterator allows the caller to traverse the elements of a collection without exposing the underlying implementation.

 

번역하면 아래와 같다.

컬렉션에 대한 반복자다. 반복자는 컬렉션의 요소를 노출하지 않고 순회할 수 있도록 한다.

 

즉, 간단하게 말하자면 List, Set, Map, Stack, Queue와 같은 컬렉션들을 순회하게 해준다.

Iterator과 반복문의 차이점

엥? 근데 반복문으로 순회를 하면 되는거 아냐?란 생각이 들 수 있다.

Iterator이 동작하는 순서는 아래와 같다.

만약 List의 크기가 100이라면 이를 순회하기 위해서는 아래와 같이 동작한다.

  • 반복문의 경우
    • 만약 index가 50인 List를 조회하려면 시작 주소부터 index만큼 요소들을 전부 거쳐가며 조회한다.
    • 즉, 1, 2, 3, 4, 5, ... ,100까지 가게 되어 총 5050번 조회하게 된다.
  • Iterator의 경우
    • 내부적으로 개게를 생성한 후 순차적으로 조회한다.
    • 즉, 1, 1, 1, 1, ...,, 1번 반복해 총 100번 조회하게 된다.

위 내용만 보면 속도면에서 Iterator이 무조건적으로 빠르게 보인다.

하지만, 객체를 내부적으로 만들기 때문에 시간이 걸리게 되어 반복문보다 속도가 느려진다.

때문에, 느린 속도를 해결하기 위해 컬렉션의 Size를 받아와서 사용한다.

 

하지만, Iterator은 반복문과 다르게 요소를 추가하거나 삭제할 때 반복문을 다시 시작할 필요가 없다.

또한, 컬렉션 내부를 순회하면서 필터링하거나 정렬이 가능하다.

위와 같은 차이점이 있기 때문에 Iterator을 사용한다고 생각하면 된다.

Iterator 메서드

Iterator을 사용하기 위해선 아래 메서드를 사용하면 된다.

1. hasNest()

hasNext() 메서드는 Iterator가 다음 요소가 있는지 여부를 확인한다.

hasNext() 메서드가 true를 반환하면 Iterator는 다음 요소를 가져올 수 있다.

hasNext() 메서드가 false를 반환하면 Iterator는 더 이상 다음 요소가 없다는 소리다.

// Iterator 호출
Iterator<String> iter = list.iterator();

// 다음 요소가 있는지 확인
while (iter.hasNext()) {
  // 다음 요소를 가져온다.
  String element = iter.next();

  // 요소를 처리
  System.out.println(element);

// 다음 요소가 있는지 확인
if (iter.hasNext()) {
  // 다음 요소가 있는 경우
} else {
  // 다음 요소가 없는 경우
}

2. next()

Iterator의 다음 요소를 반환한다.

next() 메서드를 호출하면 Iterator는 다음 요소로 이동한다.

// Iterator 호출
Iterator<String> iter = list.iterator();

// 다음 요소를 가져온다.
String element = iter.next();

// 요소를 처리
System.out.println(element);

3. remove()

Iterator가 다음으로 가리키는 요소를 컬렉션에서 제거한다.

remove() 메서드를 호출하기 전에 반드시 next() 메서드를 사용해 다음 요소를 가져와야 한다.

 // Iterator 호출
Iterator<String> iter = list.iterator();

// 다음 요소를 가져온다.(반드시 next()를 해야 함)
String element = iter.next();

// 요소를 제거
iter.remove();