코딩 스쿨 Java

언어선택 : HTMLCSSJAVAJAVASCRIPTMYSQLSQL PHP

Java Iterator

자바 Iterator: 개념 및 사용법

  • *Iterator*는 자바에서 **컬렉션(Collection)**을 순회(traverse)하거나 반복(iterate)할 때 사용되는 인터페이스입니다. Iterator는 자바의 컬렉션 프레임워크에서 제공하는 표준적인 방식으로, 특히 리스트(List), 집합(Set), 맵(Map) 등의 데이터를 순차적으로 처리할 때 유용합니다. Iterator를 사용하면 컬렉션 요소들을 하나씩 접근하고, 필요에 따라 요소를 제거할 수 있습니다.

1. Iterator의 주요 기능

Iterator는 컬렉션의 요소를 반복하면서 접근할 수 있게 해주는 메서드들을 제공합니다. Iterator 인터페이스는 다음과 같은 주요 메서드를 가지고 있습니다:

주요 메서드

  1. hasNext(): 컬렉션에 다음 요소가 있는지 여부를 확인합니다. 만약 다음 요소가 있으면 true, 없으면 false를 반환합니다.
  2. next(): 다음 요소를 반환하고, 내부적으로 커서를 다음 위치로 이동시킵니다.
  3. 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

위 예제에서 IteratorArrayList의 요소들을 순차적으로 접근하여 출력합니다. hasNext() 메서드는 다음 요소가 있는지 확인하며, next() 메서드는 다음 요소를 반환합니다.

2.2 remove() 메서드 사용

Iteratorremove() 메서드는 컬렉션에서 현재 요소를 삭제하는 데 사용됩니다. 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 요소를 순회하면서 삭제했습니다. Iteratorremove() 메서드를 사용하면 반복 중 안전하게 요소를 삭제할 수 있습니다.

3. Iteratorfor-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을 사용하여 더 간결하게 표현할 수 있습니다. 하지만, 컬렉션에서 요소를 삭제하는 작업은 Iteratorremove() 메서드를 사용해야 안전합니다.

요소 삭제 시 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. IteratorListIterator의 차이점

특징 Iterator ListIterator
순회 방향 단방향 (앞으로만 순회) 양방향 (앞과 뒤 모두 순회 가능)
사용 범위 모든 컬렉션에서 사용 가능 리스트(List)에서만 사용 가능
요소 추가 불가능 add() 메서드를 사용하여 요소 추가 가능
이전 요소 접근 불가능 previous() 메서드를 사용하여 이전 요소에 접근

요약

  • *Iterator*는 자바 컬렉션을 순회하기 위한 표준적인 방식으로, 컬렉션의 요소를 안전하게 삭제하거나 접근하는 데 유용합니다.
  • 주요 메서드로는 hasNext(), next(), remove() 등이 있으며, 컬렉션 요소에 대해 순차적으로 접근하고 삭제할 수 있습니다.
  • *ListIterator*는 Iterator를 확장한 인터페이스로, 양방향 순회와 같은 추가적인 기능을 제공합니다.
  • Iterator는 컬렉션을 반복하면서 요소를 안전하게 삭제하거나 수정하는 데 사용해야 하며, 특히 요소 삭제 시 직접 삭제하는 것보다 Iteratorremove() 메서드를 사용하는 것이 안전합니다.

Iterator는 자바에서 컬렉션의 요소들을 관리하고 처리하는 데 중요한 역할을 하며, 특히 반복문에서 컬렉션을 순회하면서 요소를 삭제해야 할 때 매우 유용합니다.


copyright ⓒ 스타트코딩 all rights reserved.
이메일 : startcodingim@gamil.com