ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [디자인 패턴] Iterator 패턴
    Programming Language/java 2023. 8. 19. 15:02

    1. Iterator 패턴이 무엇이고

    2. Iterator 패턴을 왜 사용할까?

     

    for 문을 사용해서 반복을 돌리면 될텐데 왜 굳이 Iterator 패턴을 사용할까? 

    => 반복의 대상이 되는 객체가 변경되어도 반복을 사용하는 측에서 신경쓰지 않아도 된다.

    => 즉 유지보수 측면에서 유리하다.

     

    어떻게 가능한지 Iterator 패턴이 무엇인지부터 살펴보자

     

    Iterable<E> 인터페이스와 Iterator<E> 인터페이스

    public interface Iterable<E> {
        public abstract Iterator<E> iterator();
    }
    
    
    public interface Iterator<E> {
        public abstract boolean hasNext();
        public abstract E next();
    }

    Iterable<E> 는 반복 가능 인터페이스를 의미하고 iterator 메소드가 선언되어 있다.

    Iterator<E> 는 다음 요소가 존재하는지 boolean 으로 알려주는 hasNext 와 다음 요소를 반환하는 next 메소드가 있다.

     

    Book이라는 타입으로 예를 들어보자

    
    public class BookShelf implements Iterable<Book> {
        private Book[] books;
        private int last = 0;
        
        ... 생략 ...
        
        @Overide
        public Iterator<Book> iterator() {
        	return new BookShelfIterator(this);
        }
    }

    Book 클래스와 여러개의 Book을 관리하는 BookShelf에 Iteratble 인터페이스를 붙이면

    인터페이스에 정의된 iterator 메소드를 재정의 해줘야 한다.

     

    Book의 iterator를 제공하기 위해 iterator 인터페이스의 구현체도 정의해준다.

    public class BookShelfiterator implements Iterator<Book> {
        private BookShelf bookShelf;
        private int index;
        
        public BookShelfIterator(BookShelf bookShelf) {
            this.bookShelf = bookShelf;
            this.index = 0;
    
        }
        
        ... 생략 ...
        
    	@Overide
        public boolean hasNext() {
           // hasNext 구현 생략
        }
        
        @Overide
        public Book next() {
            // next 구현 생략
        }
    }

    마찬가지로 Iterator 인터페이스에 정의된 메소드들을 구현해준다.

     

    그리고 실제 코드에서 다음과 같이 사용한다.

    Iterator<Book> it = bookShelf.iterator(); // iterator 객체 생성
    while(it.hasNext()) {
        Book book = it.next();
    }

     

    이때 BookShelf에서 여러개의 Book을 배열에서 List로 변경하거나 Set으로 변경하더라도 사용하는 코드에서는 고쳐주지 않아도 된다.

    (확장된 for문에서도 마찬가지이긴 하다...)

     

     

    단점 - 구현해놓기 귀찮다. 코드량이 많아진다.(i.e. 가독성이 떨어진다)

    리스트를 반복하는 코드가 정말 여기저기 많이 쓰이면 유용하긴할 듯 하다

    하지만 그런 케이스가 과연 실제에 많을지...?

    많지 않다면 굳이 Iterator 패턴을 안 써도 상관 없을 듯하다

Designed by Tistory.