결론
클래스를 Iterable 하게 만들어 주고 싶다 $\Rightarrow$ 맞춤형 Iterator 객체를 만들어준다.
Iterable
클래스(e.g. LinkedList<E>)가 Iterable<E> 인터페이스를 구현하면 public Iterator<E> iterator() 구현이 강제된다.
물론, 범용성을 위해 LinkedList<E>는 List<E> 인터페이스를 구현하고, List<E> 인터페이스가 Iterator<E>를 상속하는 구조가 더 좋은 것 같다.
iterator()는 for-each 문이나 Iterator<E> 객체를 통한 반복에 사용된다.
List<Integer> list = new LinkedList<Integer>();
for (Integer x : list) {
...
}
Iterator<Integer> iter = list.iterator();
while (iter.hasNext()) {
Interger x = iter.next();
...
}
iterator()는 Iterator<E> 객체를 반환하도록 구현한다.
물론, 만드는 자료구조에 따라 반환하는 Iterator<E> 객체의 동작이 달라져야하므로 해당 자료구조를 위한 Iterator<E> 객체를 따로 만들어 반환해야 한다.
방법 1. (제일 직관적)
LinkedList 클래스 안에 MyIterator 내부 클래스를 만들어준다.
MyIterator는 Iterator<E> 인터페이스를 구현한다. 이로 인해 MyIterator는 Iterator<E> 타입으로 반환이 가능해진다.
iterator()는 MyIterator 객체를 반환한다.
public class LinkedList<E> implements List<E> {
public Iterator<E> iterator(){
return new MyIterator();
}
class MyIterator implements Iterator<E>{
Node<E> index;
public MyIterator() {
index = head;
}
public boolean hasNext() {
return index != null;
}
public E next() {
if (!hasNext())
throw new NoSuchElementException();
E data = index.data;
index = index.next;
return data;
}
}
...
}
방법 2-1.
LinkedList<E> 자체가 Iterator<E> 인터페이스를 구현한다. 이로 인해 LinkedList<E>는 Iterator<E> 타입으로 반환이 가능해진다.
iterator()는 LinkedList<E> 객체를 반환한다.
public class LinkedList<E> implements Iterable<E>, Iterator<E> {
public Iterator<E> iterator(){
return this;
}
Node<E> index;
public LinkedList() {
index = head;
...
}
public boolean hasNext() {
return index != null;
}
public E next() {
if (!hasNext())
throw new NoSuchElementException();
E data = index.data;
index = index.next;
return data;
}
...
}
방법 2-2.
List<E>가 Iterator<E> 인터페이스도 상속해 Iterator<E> 타입이 된다.
물론, LinkedList<E> 클래스는 List<E>를 구현하므로 Iterator<E> 역시 구현해야 한다.
public interface List<E> extends Iterable<E>, Iterator<E> {
...
}
'프로그래밍 언어 > Java' 카테고리의 다른 글
인텔리제이 단축키 (0) | 2022.05.31 |
---|---|
제네릭 (0) | 2022.04.14 |
음수 정수의 비트 표현 (0) | 2022.04.13 |
모듈과 패키지 (0) | 2022.04.10 |
Comparable vs Comparator (0) | 2022.04.08 |