자바 - 이터레이터 사용 방법

안녕하세요, 초보 프로그래머 여러분! 오늘은 자바 이터레이터의 fascinaning한 세상으로 함께潜入합니다. 프로그래밍에 새로운 사람이라면 걱정하지 마세요; 이 개념을 단계별로 안내해 드릴게요. 수년간 수많은 학생들을 가르쳐온 경험을 바탕으로 말이죠. 이 흥미로운 여정을 함께 시작해봅시다!

Java - Iterators

이터레이터는 무엇인가요?

거대한 컬러풀한 레고 브릭 상자를 가정해 보세요. 이터레이터는 그 상자 안의 브릭을 하나씩 거르는 마법의 도우미입니다. 컬렉션의 하이어러키 구조를 알지 않고도 순차적으로 요소에 접근할 수 있는 방법입니다.

이터레이터를 사용하는 이유는 무엇인가요?

이터레이터는 다양한 유형의 컬렉션(리스트, 셋, 맵 등)을 동일한 인터페이스를 사용하여 탐색할 수 있는 표준 방법을 제공하기 때문에 매우 유용합니다. 이는 여러 종류의 컬렉션과 작동할 수 있는 코드를 작성할 때 탐색 로직을 변경하지 않아도 되기 때문입니다.

이터레이터 인터페이스

자바에서 이터레이터 인터페이스는 자바 컬렉션 프레임워크의 일부입니다. 다음과 같은 메서드를 선언합니다:

메서드 설명
hasNext() 컬렉션에 더 많은 요소가 있으면 true를 반환합니다
next() 컬렉션의 다음 요소를 반환합니다
remove() next()가 반환한 마지막 요소를 제거합니다 (선택 사항)

이터레이터의 기본 사용법

이터레이터가 어떻게 작동하는지 간단한 예제를 통해 살펴보겠습니다:

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

public class IteratorExample {
public static void main(String[] args) {
List<String> fruits = new ArrayList<>();
fruits.add("Apple");
fruits.add("Banana");
fruits.add("Cherry");

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

while (iterator.hasNext()) {
String fruit = iterator.next();
System.out.println(fruit);
}
}
}

이 예제에서 우리는 과일 목록을 만들고 그것을 이터레이터를 사용하여 하나씩 출력합니다. 이를 단계별로 설명하겠습니다:

  1. 우리는 문자열 ArrayList를 만들고 몇 가지 과일을 추가합니다.
  2. 리스트에서 이터레이터를 가져옵니다.
  3. hasNext()를 사용하여 더 많은 요소가 있는지 확인합니다.
  4. 루프 내부에서 next()를 사용하여 다음 과일을 가져와 출력합니다.

이 코드를 실행하면 각 과일이 별도의 줄에 출력됩니다. 이터레이터가 상자에서 하나씩 과일을 꺼내 보여주는 것과 같습니다!

리스트이터레이터 인터페이스

리스트에 대해, 자바는 이터레이터를 향상된 이터레이터인 ListIterator를 제공합니다. 이는 이터레이터 인터페이스를 확장하고 더 많은 기능을 추가합니다:

메서드 설명
add(E e) 지정된 요소를 리스트에 삽입합니다
hasPrevious() 이전 요소가 있으면 true를 반환합니다
previous() 리스트의 이전 요소를 반환합니다
nextIndex() next()가 반환할 요소의 인덱스를 반환합니다
previousIndex() previous()가 반환할 요소의 인덱스를 반환합니다
set(E e) next()나 previous()가 반환한 마지막 요소를 대체합니다

리스트이터레이터 사용법

리스트를 양방향으로 탐색하는 방법을 보겠습니다:

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

public class ListIteratorExample {
public static void main(String[] args) {
List<String> colors = new ArrayList<>();
colors.add("Red");
colors.add("Green");
colors.add("Blue");

ListIterator<String> listIterator = colors.listIterator();

System.out.println("정방향:");
while (listIterator.hasNext()) {
System.out.println(listIterator.next());
}

System.out.println("\n 역방향:");
while (listIterator.hasPrevious()) {
System.out.println(listIterator.previous());
}
}
}

이 예제에서 우리는 리스트이터레이터를 사용하여 색상 목록을 정방향과 역방향으로 탐색합니다. 레고 브릭을 시작에서 끝으로, 그리고 다시 반대로 걸어가는 것과 같습니다!

탐색 중 컬렉션 수정

이터레이터의 훌륭한 점 중 하나는 탐색 중 컬렉션을 수정할 수 있다는 점입니다. 특정 기준을 만족하는 요소를 제거하는 예제를 보겠습니다:

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

public class IteratorRemoveExample {
public static void main(String[] args) {
List<Integer> numbers = new ArrayList<>();
for (int i = 1; i <= 10; i++) {
numbers.add(i);
}

Iterator<Integer> iterator = numbers.iterator();
while (iterator.hasNext()) {
Integer number = iterator.next();
if (number % 2 == 0) {
iterator.remove();
}
}

System.out.println("홀수: " + numbers);
}
}

이 예제에서 우리는 목록에서 모든 짝수를 제거합니다. 이터레이터의 remove() 메서드를 사용하여 탐색 중 요소를 안전하게 제거합니다. 목록에서 직접 요소를 제거하려고 하면 ConcurrentModificationException이 발생합니다. 레고 브릭 상자에서 특정 브릭을 제거하는 것과 같은 것입니다!

결론

이터레이터는 자바에서 컬렉션을 효율적이고 안전하게 탐색하는 강력한 도구입니다. 다양한 유형의 컬렉션에 대해 동일한 인터페이스를 사용하여 요소에 접근할 수 있어 코드가 더 유연하고 재사용 가능하게 됩니다.

기억해 두세요, 프로그래밍은 레고 브릭으로 만드는 것과 같습니다. 이터레이터는 여러분이 가지고 있는 많은 멋진 도구 중 하나입니다. 계속 연습하고 탐구하면 곧 자바로 놀라운 것을 만들 수 있을 것입니다!

미래의 프로그래머 여러분, 행복하게 코딩하세요! ??‍??‍?

Credits: Image by storyset