코딩 스쿨 Java

언어선택 : HTMLCSSJAVAJAVASCRIPTMYSQLSQL PHP

Java Iterator Methods

자바에서의 Iterator 메서드 (Java Iterator Methods)

  • *Iterator*는 자바에서 컬렉션(Collection) 객체의 요소들을 순차적으로 접근하기 위해 제공되는 인터페이스입니다. Iterator
    .util.Iterator 패키지에 속하며, 리스트(List), 셋(Set), 맵(Map) 등 다양한 컬렉션 객체에서 사용됩니다. Iterator는 컬렉션 요소를 반복적으로 처리할 수 있는 기능을 제공하며, 주로 while 또는 for 루프와 함께 사용됩니다.

Iterator 생성

Iterator컬렉션 객체의 iterator() 메서드를 호출하여 생성됩니다. 이때 Iterator 객체는 컬렉션의 요소를 순차적으로 탐색할 수 있게 해줍니다.

Iterator 생성 예시

import java.util.ArrayList;
import java.util.Iterator;

public class Main {
    public static void main(String[] args) {
        // ArrayList 생성 및 값 추가
        ArrayList<String> list = new ArrayList<>();
        list.add("Apple");
        list.add("Banana");
        list.add("Orange");

        // Iterator 생성
        Iterator<String> iterator = list.iterator();

        // Iterator를 사용하여 리스트 요소 출력
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}

설명:

  • list.iterator(): ArrayList에서 Iterator를 생성하여 리스트의 요소를 순차적으로 접근할 수 있게 합니다.
  • *hasNext()*와 next() 메서드를 사용하여 반복문을 통해 요소를 처리합니다.

주요 Iterator 메서드

1. hasNext(): 다음 요소가 있는지 확인

hasNext() 메서드는 컬렉션의 다음 요소가 존재하는지 여부를 확인합니다. 다음 요소가 있으면 true, 없으면 false를 반환합니다.

import java.util.ArrayList;
import java.util.Iterator;

public class Main {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("Apple");
        list.add("Banana");
        list.add("Orange");

        Iterator<String> iterator = list.iterator();

        // 다음 요소가 있는지 확인하면서 반복
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}

설명:

  • hasNext()다음 요소가 있는지 확인할 때 사용됩니다. 주로 while 루프와 함께 사용되어 컬렉션의 모든 요소를 순차적으로 처리할 수 있습니다.

2. next(): 다음 요소 가져오기

next() 메서드는 다음 요소를 반환합니다. 이 메서드는 반복적으로 호출되어 컬렉션의 각 요소를 순차적으로 가져옵니다.

import java.util.ArrayList;
import java.util.Iterator;

public class Main {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("Apple");
        list.add("Banana");

        Iterator<String> iterator = list.iterator();

        // 첫 번째 요소 가져오기
        System.out.println("첫 번째 요소: " + iterator.next());

        // 두 번째 요소 가져오기
        System.out.println("두 번째 요소: " + iterator.next());
    }
}

설명:

  • next()는 컬렉션의 다음 요소를 반환하며, 내부적으로 커서를 다음 위치로 이동시킵니다.
  • 호출할 때마다 다음 요소로 이동하여 값을 반환합니다. 요소가 없으면 NoSuchElementException 예외가 발생할 수 있습니다.

3. remove(): 현재 요소 제거

remove() 메서드는 next()로 반환된 현재 요소를 컬렉션에서 제거합니다. 단, 이 메서드는 반드시 **next()**를 호출한 후에 사용할 수 있습니다.

import java.util.ArrayList;
import java.util.Iterator;

public class Main {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("Apple");
        list.add("Banana");
        list.add("Orange");

        Iterator<String> iterator = list.iterator();

        // 첫 번째 요소를 제거
        if (iterator.hasNext()) {
            iterator.next();  // 첫 번째 요소로 이동
            iterator.remove();  // 첫 번째 요소 제거
        }

        System.out.println(list);  // 출력: [Banana, Orange]
    }
}

설명:

  • remove()는 현재 Iterator가 가리키는 요소컬렉션에서 제거합니다.
  • next() 메서드를 호출하여 현재 요소를 반환한 후에만 remove()를 호출할 수 있습니다.

4. forEachRemaining(): 남은 요소 처리

forEachRemaining() 메서드는 컬렉션의 남은 모든 요소람다식을 사용하여 처리합니다. 이 메서드는 반복 작업을 간결하게 처리하는 데 유용합니다.

import java.util.ArrayList;
import java.util.Iterator;

public class Main {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("Apple");
        list.add("Banana");
        list.add("Orange");

        Iterator<String> iterator = list.iterator();

        // 남은 요소를 람다식을 사용하여 출력
        iterator.forEachRemaining(fruit -> System.out.println(fruit));
    }
}

설명:

  • forEachRemaining()Iterator에서 아직 처리되지 않은 모든 요소에 대해 작업을 수행하는 람다식을 적용합니다.

Iterator의 활용 예시

1. 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");
        fruits.add("Mango");

        Iterator<String> iterator = fruits.iterator();

        // "Orange"라는 요소를 삭제
        while (iterator.hasNext()) {
            String fruit = iterator.next();
            if (fruit.equals("Orange")) {
                iterator.remove();  // 안전하게 요소 제거
            }
        }

        System.out.println(fruits);  // 출력: [Apple, Banana, Mango]
    }
}

설명:

  • Iterator는 반복문에서 안전하게 요소를 삭제할 수 있도록 해줍니다. for-each 루프에서 요소를 삭제하면 **ConcurrentModificationException*이 발생할 수 있지만, Iterator는 이를 방지합니다.

2. 맵(Map)의 Iterator 사용

  • *HashMap*과 같은 맵에서 Iterator를 사용하려면 **entrySet()*을 통해 각 **키-값 쌍(Map.Entry)**을 순회할 수 있습니다.
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        HashMap<String, Integer> map = new HashMap<>();
        map.put("Apple", 10);
        map.put("Banana", 15);
        map.put("Orange", 20);

        Iterator<Map.Entry<String, Integer>> iterator = map.entrySet().iterator();

        // Map의 모든 키-값 쌍 출력
        while (iterator.hasNext()) {
            Map.Entry<String, Integer> entry = iterator.next();
            System.out.println("키: " + entry.getKey() + ", 값: " + entry.getValue());
        }
    }
}

출력:

키: Apple, 값: 10
키: Banana, 값: 15
키: Orange, 값: 20

설명:

  • HashMapentrySet()을 통해 Iterator를 사용하여 맵의 요소를 순회할 수 있습니다.
  • 키와 값을 각각 출력하거나 필요에 따라 수정, 제거할 수 있습니다.

요약

자바의 **Iterator**는 컬렉션의 요소를 순차적으로 접근하는 데 사용되며, 컬렉션에서 안전하게 요소를 삭제하거나 처리할 수 있습니다. 주요 메서드는 다음과 같습니다:

  • hasNext(): 다음 요소가 있는지 확인
  • next(): 다음 요소를 가져오기
  • remove(): 현재 요소를 컬렉션에서 제거
  • forEachRemaining(): 남은 요소를 람다식으로 처리

Iterator리스트(List), 셋(Set), 맵(Map) 등 다양한 컬렉션과 함께 사용되어 요소를 반복적으로 처리하고, 동시에 요소를 안전하게 제거하는 데 매우 유용합니다.


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