java spring을 이용하다가 Iterator 라는 개념이 나와서 정확하게 집고 넘어가기 위해서 정리.
Iterator는 어떤 역할인지는 알겠지만 어떤 계층구조를 갖고 있는지 궁금햇고, 공부하다 보니 Iterable이 있길래 어떤 차이가 있는지도 모르겠어서 정리하려고 한다.
Collection 인터페이스와 List, Set, Queue 인터페이스의 계층구조이고, Iterable이 Collection의 상위 인터페이스이다.
내부 구현 코드 확인
public interface Collection<E> extends Iterable<E> {
// Query Operations
/**
* Returns the number of elements in this collection. If this collection
* contains more than <tt>Integer.MAX_VALUE</tt> elements, returns
* <tt>Integer.MAX_VALUE</tt>.
*
* @return the number of elements in this collection
*/
이렇듯 Collection 인터페이스의 상위 인터페이스는 Iterable 이라는 것을 알 수 있다.
그러면 Iterable의 내부를 한번 보면
public interface Iterable<T> {
/**
* Returns an iterator over elements of type {@code T}.
*
* @return an Iterator.
*/
Iterator<T> iterator();
Iterable 인터페이스 안에는 iterator 메소드가 추상메소드로 선언이 되어있다. 이렇기 때문에 Collection 인터페이스 계층구조에서 List, Set, Queue 를 구현하는 클래스들은 다 iterator 메소드를 가지고 있다. 따라서 Iterable의 역할은 iterator() 메소드를 하위 클래스에서 무조건 구현을 하게 만들기 위함이다.
Iterator 인터페이스는 Collection 과는 별개로 존재하는 인터페이스이다.
public interface Iterator<E> {
/**
* Returns {@code true} if the iteration has more elements.
* (In other words, returns {@code true} if {@link #next} would
* return an element rather than throwing an exception.)
*
* @return {@code true} if the iteration has more elements
*/
boolean hasNext();
/**
* Returns the next element in the iteration.
*
* @return the next element in the iteration
* @throws NoSuchElementException if the iteration has no more elements
*/
E next();
/**
* Removes from the underlying collection the last element returned
* by this iterator (optional operation). This method can be called
* only once per call to {@link #next}. The behavior of an iterator
* is unspecified if the underlying collection is modified while the
* iteration is in progress in any way other than by calling this
* method.
*
* @implSpec
* The default implementation throws an instance of
* {@link UnsupportedOperationException} and performs no other action.
*
* @throws UnsupportedOperationException if the {@code remove}
* operation is not supported by this iterator
*
* @throws IllegalStateException if the {@code next} method has not
* yet been called, or the {@code remove} method has already
* been called after the last call to the {@code next}
* method
*/
default void remove() {
throw new UnsupportedOperationException("remove");
}
Iterator 인터페이스의 내부 구현은 위와 같이 되어있고, 따라서 위의 hasNext(), next(), remove() 등의 메소드를 이용할 수 있다. 용도는 컬렉션클래스의 데이터를 하나씩 읽어올 때 사용한다. 표준화가 되어있지 않다면 컬렉션 클래스의 데이터를 읽어올 때마다 해당 클래스의 데이터를 꺼내오는 메소드들을 다 알고 있어야 하기 때문에 Iterator이 존재한다.
또한 공통 인터페이스를 정이해서 표준을 정의하고 구현하여 표준을 따르도록 함으로써 코드의 일관성을 유지하여 재사용성을 극대화 하는것이 객체지향 프로그래밍의 중요한 목적 중 하나이다.
import java.util.Iterator;
import java.util.LinkedList;
public class Test {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<>();
list.add("Lee"); list.add("ekk"); list.add("eww");
Iterator it = list.iterator();
while (it.hasNext()) {
System.out.print(it.next() + " ");
}
}
}
예시의 코드와 같은 상황이 있을 때, list.iterator() 의 역할을 생각해보자. 참조변수 list로 iterator메소드를 호출했다.
따라서 iterator은 LinkedList의 형태의 Iterator을 반환할 것이다. 그리고 나서 hasNext(), next() 메소드를 통해서 출력을 하게 된다.