자료 구조에서 순회는 자료 구조에 들어있는 데이터를 차례대로 접근해서 처리하는 것
다양한 자료 구조가 있고, 각각의 자료 구조마다 데이터를 접근하는 방법이 모두 다름
index를 size까지 차례로 증가하면서 순회해야 하고, 연결 리스트는 node.next를 사용해서 node의 끝이 null일 때까지 순회해야 함배열 리스트, 연결 리스트, 해시 셋, 연결 해시 셋, 트리 셋 등등 다양한 자료 구조가 있음
하지만 자료 구조를 사용하는 개발자 입장에서 보면 단순히 자료 구조에 들어있는 모든 데이터에 순서대로 접근해서 출력하거나 계산하고 싶을 뿐
- 자바는 이런 문제를 해결하기 위해
Iterable과Iterator인터페이스를 제공함
public interface Iterable<T> {
Iterator<T> iterator();
}
public interface Iterator<E> {
boolean hasNext();
E next();
}
hastNext() : 다음 요소가 있는지 확인하고, 다음 요소가 없으면 false를 반환
next() : 다음 요소를 반환하고, 내부에 있는 위치를 다음으로 이동함
자료 구조에 들어있는 데이터를 처음부터 끝까지 순회하는 방법은 단순함
package collection.iterable;
import java.util.Iterator;
public class MyArrayIterator implements Iterator<Integer> {
private int currentIndex = -1;
private int[] targetArr;
public MyArrayIterator(int[] targetArr) {
this.targetArr = targetArr;
}
@Override
public boolean hasNext() {
return currentIndex < targetArr.length - 1;
}
@Override
public Integer next() {
return targetArr[++currentIndex];
}
}
Iterator는 단독으로 사용할 수 없음Iterator를 통해 순회의 대상이 되는 자료구조를 만들어야 함package collection.iterable;
import java.util.Iterator;
public class MyArray implements Iterable<Integer> {
private int[] numbers;
public MyArray(int[] numbers) {
this.numbers = numbers;
}
@Override
public Iterator<Integer> iterator() {
return new MyArrayIterator(numbers);
}
}
Iterable 인터페이스를 구현MyArrayIterable를 반환함MyArrayIterator는 생성자를 통해 MyArray의 내부 배열인 numbers를 참조함package collection.iterable;
import java.util.Iterator;
public class MyArrayMain {
public static void main(String[] args) {
MyArray myArray = new MyArray(new int[]{1, 2, 3, 4});
Iterator<Integer> iterator = myArray.iterator();
System.out.println("iterator 사용");
while (iterator.hasNext()) {
Integer value = iterator.next();
System.out.println("value = " + value);
}
}
}
실행 결과
iterator 사용
value = 1
value = 2
value = 3
value = 4

MyArray는 Iterator 인터페이스를 구현함MyArray는 반복할 수 있다는 의미가 됨Iterator 인터페이스를 구현하면 iterator() 메서드를 구현해야 함Iterator 인터페이스를 구현한 반복자를 반환함MyArrayIterator를 생성해서 반환함