Iterator Pattern 

- 컬렉션의 내부구조와 상관없이 그 집합체 안의 모든 항목을 열거하는 패턴

 - Java에서는 Iterable<E> / Iterator<E> 라는 인터페이스를 구현하면 사용 가능하다.


  1. class Node<E> { //Generiec - type argument
  2.         public final E data;
  3.         public final Node<E> next; // Object
  4.        
  5.         public Node(E data, Node<E> next) { // Object
  6.                 this.data = data;
  7.                 this.next = next;
  8.         }
  9.        
  10. }
  11.  
  12. class SList<E> implements Iterable<E> {
  13.         private Node<E> head;
  14.        
  15.        
  16.         public SList() {
  17.                 head = null;
  18.         }
  19.         public void addFront (E n) {
  20.                 head = new Node<E>(n, head);
  21.         }
  22.         public E front() {
  23.                 return head.data;
  24.         }
  25.        
  26.         @Override
  27.         public Iterator<E> iterator() {
  28.                 return new SListIterator<E>(head);
  29.         }
  30.        
  31.         // 외부로 노출되지 않기 위해 private class 로 구현하는게 일반적이다.
  32.         @SuppressWarnings("hiding")
  33.         private class SListIterator<E> implements Iterator<E> {
  34.                 private Node<E> current;
  35.                
  36.                 public SListIterator(Node<E> node) {
  37.                         this.current = node;
  38.                 }
  39.                
  40.                 @Override
  41.                 public boolean hasNext() {
  42.                         return current != null;
  43.                 }
  44.  
  45.                 //현재의 요소를 반환하며 다음으로 이동
  46.                 @Override
  47.                 public E next() {
  48.                         E value = current.data;
  49.                         current = current.next;
  50.                         return value;
  51.                 }
  52.  
  53.                 @Override
  54.                 public void remove() {
  55.                         // 지원하지 않음
  56.                         throw new UnsupportedOperationException("remove() unsupported!");
  57.                        
  58.                 }
  59.                
  60.         }
  61. }
  62. public class Ex2 {
  63.        
  64.         public static void main(String[] args) {
  65.                 SList<String> s = new SList<>();
  66.                 s.addFront("aaa");
  67.                 s.addFront("bbb");
  68.                 s.addFront("ccc");
  69.                 Iterator<String> iter = s.iterator();
  70.                
  71.                 while(iter.hasNext()) {
  72.                         System.out.println(iter.next());
  73.                 }
  74.                
  75.                 for(String e : s) { // 내부적으로 iterator 를 사용한다.
  76.                         System.out.println(e);
  77.                 }
  78.                
  79.                 //Collections, List<T>  // interface
  80.                
  81.         }
  82.  
  83. }



+ Recent posts