Iterator 란
Iterator
" Java 에서 Iterator 는 리스트나 맵 등의 컬렉션 요소를 반복적으로 접근하고 삭제하기 위한 인터페이스이다. "
Iterator는 컬렉션의 내부 구조를 알 필요 없이 간편하게 요소에 접근할 수 있도록 도와줍니다.
Iterator는 java.util 패키지에 속한 인터페이스로, 다음과 같은 세 가지 주요 메서드를 제공합니다:
- E next
- 'hasNext()' 메서드로 요소의 존재를 확인한 뒤에 호출
- 요소가 존재하지 않을 경우 'NoSuchElementException' 예외 발생
- void remove()
- 현재 반복 중인 요소를 삭제
- 이 메서드를 호출하기 전에 'next()' 메서드로 요소를 가져와야함
- remove() 메서드는 반복 중에 한번만 호출 할 수 있음
- 컬렉션에서 요소를 직접 삭제하는 것과 달리, Iterator 를 통해 요소를 삭제하면 컬렉션의 구조가 올바르게 유지됨
Iterator 의 사
Iterator를 사용하면 컬렉션의 요소를 순차적으로 접근하면서 컬렉션을 수정할 수 있습니다.
이는 일반적인 for 루프나 인덱스를 사용하는 것보다 더 유연하고 안전한 방법입니다.
Iterator를 통해 컬렉션을 순회하면서 필요한 경우 요소를 제거할 수 있습니다.
import java.util.ArrayList;
import java.util.Iterator;
public class IteratorExample {
public static void main(String[] args) {
// ArrayList 생성
ArrayList<String> fruits = new ArrayList<>();
fruits.add("사과");
fruits.add("바나나");
fruits.add("딸기");
fruits.add("오렌지");
// Iterator 생성
Iterator<String> iterator = fruits.iterator();
// hasNext()와 next()를 사용하여 요소에 접근
while (iterator.hasNext()) {
String fruit = iterator.next();
System.out.println(fruit);
}
// remove()를 사용하여 요소 삭제
iterator = fruits.iterator(); // 새로운 Iterator 생성 (초기화)
while (iterator.hasNext()) {
String fruit = iterator.next();
if (fruit.equals("바나나")) {
iterator.remove();
}
}
// 삭제 후의 ArrayList 출력
System.out.println(fruits);
}
}
사과
바나나
딸기
오렌지
[사과, 딸기, 오렌지]
Iterator 의 주요 사용 목적 및 특징
Iterator 의 사용 목적
1. 요소의 순차적 접근
Iterator 를 사용하면 컬렉션의 요소를 순차적으로 접근할 수 있음
-> 컬렉션의 내부 구조에 대해 알 필요 없이 요소에 접근할 수 있어서 편리함
2. 요소의 안전한 삭제
Iterator 를 통해 요소를 안전하게 삭제할 수 있어 컬렉션의 구조가 올바르게 유지됨
* 일반적인 for루프에서 컬렉션을 순회하면서 요소를 삭제하면 예외가 발생하거나 예상치 못한 동작이 발생할 수 있음
3. 동시 수정 방지
Iterator를 통해 순회하는 동안 다른 스레드에서 컬렉션을 수정하는 것을 방지함
-> 컬렉션의 구조가 변경되지 않도록 보장
Iterator의 주요 특징
1. 단방향 순회
Iterator 는 순방향으로만 이동할 수 있기 때문에 이전 요소로 돌아가거나 뒤로 이동하는 경우보다는 순차적인 단방향 순회에 적합함
2. 요소 삭제 가능
remove() 메서드를 호출하여 현재 반복 중인 요소를 삭제할 수 있음
컬렉션에서 요소를 직접삭제하는 것과 달리 안전하고 정확한 삭제를 보장함
3. 예외 발생 가능
NoSuchElementException 예외가 발생할 수 있음
next() 메서드를 호출하기 전에 hasNext() 메서드로 다음 요소의 존재 여부를 확인해야함
또한 remove() 메서드는 next() 메서드를 호출한 후에만 호출할 수 있음
iterator와 listIterator의 차이점
1. 컬렉션 타입
- Iterator
- Collection 인터페이스에 정의되어 있는 컬렉션 타입(예: ArrayList, LinkedList)과 함께 사용
- ListIterator
- List 인터페이스에 정의되어 있는 List 컬렉션 타입(예: ArrayList, LinkedList)와 함께 사용
- List 컬렉션에서만 사용할 수 있음
2. 이동 방향
- Iterator
- 단방향으로만 이동하여 이전 요소로 돌아갈 수 없음
- ListIterator
- Iterator의 기능을 모두 포함하면서도 양방향으로 이동가능
- 순차적으로 다음 요소 또는 이전 요소로 이동할 수 있음
3. 요소 추가/수정
- Iterator
- 순회 중인 컬렉션에 요소를 삭제할 수는 있지만 요소를 추가하거나 수정할 수 없음
- ListIterator
- add() 메서드를 사용하여 현재 위치에 요소를 추가
- set() 메서드를 사용하여 현재 위치의 요소를 수정
4. 인덱스 접근
- Iterator
- 인덱스를 직접적으로 접근하는 기능을 제공하지 않음
- ListIterator
- List 컬렉션에서 현재 위치의 인덱스를 확인하고 수정할 수 있는 기능 제공
- nextIndex() : 다음 요소의 인덱스를 확인
- previousIndex() : 이전 요소의 인덱스 확인
요약
Iterator는 모든 Collection 타입에 사용할 수 있고, 단방향으로만 이동하며 요소를 삭제할 수 있습니다.
ListIterator는 List 타입에 사용할 수 있고, 양방향으로 이동하며 요소의 추가/수정도 가능합니다.
ListIterator는 Iterator의 기능을 확장하고 추가적인 기능을 제공합니다
'2.Container' 카테고리의 다른 글
Queue에서, poll()과 remove()의 차이 (0) | 2023.07.19 |
---|---|
ArrayList 와 Vector 의 차이점 / Array와 ArrayList의 차이점 (0) | 2023.07.18 |
ArrayList, LinkedList 차이점 / Array -> List 로 전환하려면? (0) | 2023.07.14 |
HashMap vs Hashtable / HashMap vs TreeMap / HashSet (0) | 2023.07.13 |
Collection과 Collections의 차이는? / List, Set, Map의 차이점 (0) | 2023.07.12 |