Java Iterator
자바 Iterator
: 개념 및 사용법
- *
Iterator
*는 자바에서 **컬렉션(Collection)**을 순회(traverse)하거나 반복(iterate)할 때 사용되는 인터페이스입니다.Iterator
는 자바의 컬렉션 프레임워크에서 제공하는 표준적인 방식으로, 특히 리스트(List), 집합(Set), 맵(Map) 등의 데이터를 순차적으로 처리할 때 유용합니다.Iterator
를 사용하면 컬렉션 요소들을 하나씩 접근하고, 필요에 따라 요소를 제거할 수 있습니다.
1. Iterator
의 주요 기능
Iterator
는 컬렉션의 요소를 반복하면서 접근할 수 있게 해주는 메서드들을 제공합니다. Iterator
인터페이스는 다음과 같은 주요 메서드를 가지고 있습니다:
주요 메서드
hasNext()
: 컬렉션에 다음 요소가 있는지 여부를 확인합니다. 만약 다음 요소가 있으면true
, 없으면false
를 반환합니다.next()
: 다음 요소를 반환하고, 내부적으로 커서를 다음 위치로 이동시킵니다.remove()
:Iterator
가 가리키는 요소를 컬렉션에서 제거합니다. 이 메서드는 선택적으로 사용할 수 있으며,Iterator
가 요소를 순회하는 중에 안전하게 요소를 삭제할 수 있습니다.
2. Iterator
사용 예제
2.1 ArrayList
에서 Iterator
사용
import java.util.ArrayList;
import java.util.Iterator;
public class Main {
public static void main(String[] args) {
// ArrayList 생성
ArrayList<String> fruits = new ArrayList<>();
fruits.add("Apple");
fruits.add("Banana");
fruits.add("Orange");
// Iterator 생성
Iterator<String> iterator = fruits.iterator();
// Iterator를 사용한 요소 순회
while (iterator.hasNext()) {
String fruit = iterator.next();
System.out.println(fruit);
}
}
}
출력 예시:
Apple
Banana
Orange
위 예제에서 Iterator
는 ArrayList
의 요소들을 순차적으로 접근하여 출력합니다. hasNext()
메서드는 다음 요소가 있는지
확인하며, next()
메서드는 다음 요소를 반환합니다.
2.2 remove()
메서드 사용
Iterator
의 remove()
메서드는 컬렉션에서 현재 요소를 삭제하는 데 사용됩니다. Iterator
를
사용하면 안전하게 요소를 삭제할 수 있으며, 반복 중에 직접 컬렉션에서 삭제하는 것이 아닌 Iterator
를 통해 삭제해야 안전합니다.
import java.util.ArrayList;
import java.util.Iterator;
public class Main {
public static void main(String[] args) {
ArrayList<String> fruits = new ArrayList<>();
fruits.add("Apple");
fruits.add("Banana");
fruits.add("Orange");
// Iterator 생성
Iterator<String> iterator = fruits.iterator();
// Iterator를 사용하여 Banana 삭제
while (iterator.hasNext()) {
String fruit = iterator.next();
if (fruit.equals("Banana")) {
iterator.remove(); // Banana 삭제
}
}
// 삭제 후 결과 출력
System.out.println(fruits); // 출력: [Apple, Orange]
}
}
출력 예시:
[Apple, Orange]
위 예제에서는 Banana
요소를 순회하면서 삭제했습니다. Iterator
의 remove()
메서드를 사용하면 반복 중
안전하게 요소를 삭제할 수 있습니다.
3. Iterator
와 for-each
문 비교
자바에서는 향상된 for-each
문을 사용하여 컬렉션을 더 간편하게 순회할 수 있습니다. 그러나 for-each
문은
요소를 삭제하는 작업에는 적합하지 않으며, 이런 경우에는 Iterator
를 사용해야 합니다.
for-each
문 사용 예제
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ArrayList<String> fruits = new ArrayList<>();
fruits.add("Apple");
fruits.add("Banana");
fruits.add("Orange");
// 향상된 for문을 사용한 순회
for (String fruit : fruits) {
System.out.println(fruit);
}
}
}
위 예제처럼, 간단한 컬렉션 순회는 for-each
문을 사용하여 더 간결하게 표현할 수 있습니다. 하지만, 컬렉션에서 요소를 삭제하는 작업은
Iterator
의 remove()
메서드를 사용해야 안전합니다.
요소 삭제 시 for-each
대신 Iterator
사용
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ArrayList<String> fruits = new ArrayList<>();
fruits.add("Apple");
fruits.add("Banana");
fruits.add("Orange");
// for-each에서는 요소를 삭제할 수 없으므로 Iterator를 사용
for (String fruit : fruits) {
// 컬렉션에서 요소를 직접 삭제할 경우 ConcurrentModificationException 발생 가능
if (fruit.equals("Banana")) {
fruits.remove(fruit); // 안전하지 않음 (예외 발생 가능)
}
}
}
}
위 코드에서 for-each
문에서 요소를 삭제하려고 하면 **ConcurrentModificationException
**이 발생할 수 있습니다. 따라서 컬렉션을
순회하면서 요소를 삭제해야 할 때는 반드시 **Iterator
**를 사용해야 합니다.
4. ListIterator
인터페이스
- *
ListIterator
*는Iterator
를 확장한 인터페이스로, 양방향으로 순회할 수 있는 기능을 제공합니다.ListIterator
는 리스트(List)와 같은 양방향 구조에서만 사용할 수 있으며, 앞으로 이동하거나 뒤로 이동할 수 있는 기능을 제공합니다.
주요 메서드
hasPrevious()
: 이전 요소가 있는지 확인.previous()
: 이전 요소를 반환하고, 커서를 이전으로 이동.nextIndex()
: 다음 요소의 인덱스를 반환.previousIndex()
: 이전 요소의 인덱스를 반환.add(E e)
: 새로운 요소를 리스트에 추가.
ListIterator
사용 예제
import java.util.ArrayList;
import java.util.ListIterator;
public class Main {
public static void main(String[] args) {
ArrayList<String> fruits = new ArrayList<>();
fruits.add("Apple");
fruits.add("Banana");
fruits.add("Orange");
// ListIterator 생성
ListIterator<String> listIterator = fruits.listIterator();
// 앞 방향으로 순회
System.out.println("Forward:");
while (listIterator.hasNext()) {
System.out.println(listIterator.next());
}
// 뒤 방향으로 순회
System.out.println("\\\\nBackward:");
while (listIterator.hasPrevious()) {
System.out.println(listIterator.previous());
}
}
}
출력 예시:
Forward:
Apple
Banana
Orange
Backward:
Orange
Banana
Apple
위 예제에서 ListIterator
는 리스트를 앞 방향과 뒤 방향으로 모두 순회할 수 있는 기능을 제공합니다.
5. Iterator
와 ListIterator
의 차이점
특징 | Iterator |
ListIterator |
---|---|---|
순회 방향 | 단방향 (앞으로만 순회) | 양방향 (앞과 뒤 모두 순회 가능) |
사용 범위 | 모든 컬렉션에서 사용 가능 | 리스트(List)에서만 사용 가능 |
요소 추가 | 불가능 | add() 메서드를 사용하여 요소 추가 가능 |
이전 요소 접근 | 불가능 | previous() 메서드를 사용하여 이전 요소에 접근 |
요약
- *
Iterator
*는 자바 컬렉션을 순회하기 위한 표준적인 방식으로, 컬렉션의 요소를 안전하게 삭제하거나 접근하는 데 유용합니다. - 주요 메서드로는
hasNext()
,next()
,remove()
등이 있으며, 컬렉션 요소에 대해 순차적으로 접근하고 삭제할 수 있습니다. - *
ListIterator
*는Iterator
를 확장한 인터페이스로, 양방향 순회와 같은 추가적인 기능을 제공합니다. Iterator
는 컬렉션을 반복하면서 요소를 안전하게 삭제하거나 수정하는 데 사용해야 하며, 특히 요소 삭제 시 직접 삭제하는 것보다Iterator
의remove()
메서드를 사용하는 것이 안전합니다.
Iterator
는 자바에서 컬렉션의 요소들을 관리하고 처리하는 데 중요한 역할을 하며, 특히 반복문에서 컬렉션을 순회하면서 요소를 삭제해야 할 때 매우 유용합니다.