[디자인패턴]배열 요소를 표시하기위한 이터레이터(Iterator) 패턴 :: 개발/일상_Mr.lee

[디자인패턴]배열 요소를 표시하기위한 이터레이터(Iterator) 패턴

Posted by Mr.mandu.
2020. 12. 29. 20:42 개발/디자인패턴

안녕하세요.

디자인패턴 이라는 카테고리를 만들어 놓고

거의 몇년간 포스팅을 안했네요.


공부를 그만큼 안했다는 거죠.

이제 공부를 하나씩 해가며 포스팅을 진행할 예정 입니다.


오늘은 이터레이터(Iterator) 패턴을 포스팅 하려고 합니다.


일반 적으로 우리는 반복문을 사용할때 for 문을 주로 사용합니다.

for(int i=0, i< 10; i++) 

이런식으로 말이죠.


이터레이터(Iterator) 패턴은 for문에서 사용하고 있는 변수 i의 기능을 추상화해서 일반화 한 것 입니다.

정리하면, 배열 등의 많이 모여있는 것들을 순서대로 지정하면서 

전체를 검색하는 처리를 실행하기 위한 것 입니다.


다음은 이터레이터(Iterator) 패턴에 사용되는 클래스 및 인터페이스 입니다.


파일명 

 설명 

 Aggregate

 집합체를 나타내는 인터페이스 (집합체 역할)

 Iterator

 하나씩 나열하면서 검색을 실행하는 인터페이스 (반복자 역할)

 Book 

 책을 나타내는 클래스 

 BookShelf 

 서가를 나타내는 클래스 (구체적인 집합체 역할)

 BookShelfIterator 

 서가를 검색하는 클래스 (구체적인 반복자 역할)

 Main 

 동작 테스트용 클래스 


이제 파일들을 하나씩 소개해보도록 하겠습니다.


Aggregate 인터페이스 입니다.

package Iterator;

public interface Aggregate {
    public abstract Iterator iterator();
}

Aggregate라는 집합체를 활용하여 이에 대응하는 Iterator를 구현합니다.


Iterator 인터페이스

package Iterator;

public interface Iterator {
    public abstract boolean hasNext();
    public abstract Object next();
}

hasNext()함수와 next()함수는 자바 프로그래밍을 하면서 자주 봐왔을 것입니다.

다음은 Book 클래스입니다.


Book 클래스

package Iterator;

public class Book {
    private String name;
    public Book(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
}
다음은 BookShelf 클래스 입니다.

Bookshelf 클래스

package Iterator;

import java.util.ArrayList;

public class BookShelf implements Aggregate {
    private ArrayList<Book> bookList = new ArrayList<Book>();
    
    public Book getBookAt(int index) {
        return bookList.get(index);
    }
    
    public void addBook(Book book) {
    	bookList.add(book);
    }
    
    public int getLength() {
        return bookList.size();
    }
    
    public Iterator iterator() {
        return new BookShelfIterator(this);
    }
}


BookShelf 클래스에서 집합체 역할을 하는 Aggregate 인터페이스를 구현하고 있다는 점을

유심히 봐야 합니다.

그리고 Iterator 메소드는 BookShelfIterator라는 클래스의 인스턴스를 생성하여 반환합니다.


이번엔 BookShelfIterator 클래스입니다.

package Iterator;

public class BookShelfIterator implements Iterator {
    private BookShelf bookShelf;
    private int index;
    public BookShelfIterator(BookShelf bookShelf) {
        this.bookShelf = bookShelf;
        this.index = 0;
    }
    public boolean hasNext() {
        if (index < bookShelf.getLength()) {
            return true;
        } else {
            return false;
        }
    }
    public Object next() {
        Book book = bookShelf.getBookAt(index);
        index++;
        return book;
    }
}

Iterator 인터페이스를 구현하는 모습입니다.

BookShelf 클래스와 Book 클래스를 조작하며 hasNext()와 next()를 구현하고 있습니다.


이제 작성한 코드를 실행시킬 Main 클래스를 알아보겠습니다.

Main 클래스

package Iterator;

/**
 *  Iterator 패턴
 *  무엇인가 많이 모여있는 것들을 순서대로 지정하면서 
 *  전체를 검색하는 처리를 실행하기 위함 
 */

public class Main {
    public static void main(String[] args) {
    	
    	BookShelf bookShelf = new BookShelf();
    	
    	bookShelf.addBook(new Book("One Book"));
        bookShelf.addBook(new Book("Bible"));
        bookShelf.addBook(new Book("DB SQL"));
        bookShelf.addBook(new Book("Daddy-Long-Legs"));
        bookShelf.addBook(new Book("End Book"));
    	
        Iterator it = bookShelf.iterator();
        while (it.hasNext()) {
            Book book = (Book)it.next();
            System.out.println(book.getName());
        }
        
    }
}

작성한 코드를 실행시키면 정상적으로 실행되는 모습을 확인 할 수 있습니다.


이터레이터(Iterator) 패턴의 소스는 어렴풋(?) 이해 할 수 있을거 같다.

하지만, 왜 이렇게 번거롭게 사용해야하고 어디서 강력한 효과를 볼 수 있는지는 모르겠다.


서적을 참고해서 설명해 보면,

가장 큰 장점은 Iterator를 사용함으로써 구현과 불리해서 하나씩 셀 수 있습니다.

아직도 무슨 말인지 모르겟다. 좀더 자세히 설명을 하면

사용하고 있는 함수는 hasNext()와 next()일뿐, BookShelf의 구현에서 사용되고 있는 메소드는 호출하지 않습니다.

결국, 위 코드의 while 루프는 BookShelf의 구현에 의존하지 않다는 의미가 됩니다.


실제로 위의 예제코드는 제가 연습문제에 있는 내용을 풀이 한것으로, 책에서 공부한 소스와는 다릅니다.

기존에는 Main 클래스에서 Book을 배열로 선언하며 크기도 고정된 크기로 받아야 합니다.


하지만 BookShelf에서 Book을 ArrayList로 바꾸어 봤는데도 while 문의 내용은 변경하지 않았습니다.

아마 이게 재사용이고 의존하지 않다는 내용같습니다.


아직은 잘은 모르지만 좀더 알아가며 적절한 활용의 예시가 있다면

포스팅에 추가하겠습니다.


그리고 같이 공부하는 입장으로서 댓글로 궁금한 점을 문의해주시면

아는 선에서 답변해드리도록 하겠습니다.


고생하세요.


※ 본 포스팅은 Java언어로 배우는 디자인 패턴 입문 책을 공부하며 작성하고 있습니다.