-
[디자인 패턴] 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 패턴을 안 써도 상관 없을 듯하다
'Programming Language > java' 카테고리의 다른 글
[디자인 패턴] Template Method 패턴 (0) 2023.08.20 [디자인 패턴] Adapter 패턴 (0) 2023.08.19 Thread start() run() 차이 (0) 2022.06.26 JAVA - 클래스변수, 인스턴스변수, 지역변수 (0) 2021.01.05 Java 배열 내용 값이 같은지 비교하려면, (0) 2021.01.04