반복문을 이용해 배열를 각각 출력할 때 다음과 같은 코드를 사용합니다.
int arr[] = {1,2,3,4,5};
for (int x:arr){
system.out.println(x);
}
이런 반복문을 쓰는 경우는 굉장히 흔하기때문에 (int x:arr) 이 부분을 Iterator 인터페이스를 구현해보겠습니다.
public Iterator<E> iterator(){
return new IteratorHelper();
}
Iterator 인터페이스를 구현하는 클래스를 만들었습니다.
public class LinkedList<E> implements ListI<E>{
class IteratorHelper implement Iterator<E>{
Node<E> index;
public IteratorHelper(){
index=head;
}
public boolean hasNext(){
return (index != null)
}
public E next(){
if (!hasNext())
throw new NoSuchElementException();
E val = index.data;
index = index.next;
return val;
}
}
}
LinkedList<E>
를 정의하면서 이 안엔 addFirst, addLast, removeFirst.... 와 같은 메소드가 있습니다.
그리고 이 안에 IteratorHelper
내부클래스를 만들었습니다.
이 클래스는 Iterator를 구현합니다.
Iterator 인터페이스에는 구현해야할 메소드가 두개 있습니다.
IteratorHelper를 구현하면서 컴파일이 안 된경우 remove메소드를 구현하지 않았기 때문입니다.
그러나 자바 1.8 에서는 인터페이스에서 기본 메소드를 구현 할 수 있게되었습니다.
interator인터페이스에 remove라는 메소드가 UnsupportedOperationException를 발생시키도록 구현되어있습니다.
그래서 1.8에서는 remove메소드를 신경 쓸 필요가 없습니다.
생성자에선 index가 head를 가르키게 했습니다.
hasNext는 index가 null을 가르키는지만 알면 됩니다.
리스트가 비어있거나, 리스트의 마지막에 온 경우 index가 null이면 반환 할 것이 없으므로 index != null을 반환했습니다.
next는 hasNext가 true인지 확인합니다. 즉 리스트가 비어있는지 확인을 한 후,
false라면 NoSuchElementException()
를 발생시킵니다.
반환할것이 있다면 val에게 index.data를 대입하고, index는 다음 노드를 가르킵니다.
이렇게 작성을 하면 LinkedList의 내용들을 차례로 출력할 수 있습니다.