Iterator 인터페이스

nn·2022년 1월 30일
0

반복문을 이용해 배열를 각각 출력할 때 다음과 같은 코드를 사용합니다.

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 인터페이스에는 구현해야할 메소드가 두개 있습니다.

  • hasNext : 다음 노드가 있으면 true를 반환, 포인터가 null을 가르키고 있으면 false를 반환합니다.
  • next : 현재 가리키고 있는 것을 반환합니다.

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의 내용들을 차례로 출력할 수 있습니다.

profile
내가 될 거라고 했잖아

0개의 댓글