728x90
반응형
🟰Iterator 패턴?
📌어떠한 객체의 집합, 값의 집합을 하나씩 지정해서 순서대로 처리하는 패턴
📌반복하는 의미를 갖고 있다.
⏬이해를 돕기 위한 예시 코드
✅Book 객체(책장에 넣을 객체)
package bookshelf;
public class Book {
private String name;
public Book(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
✅ Iterator 역할을 구현할 인터페이스
package bookshelf;
import java.util.Iterator;
/***
* Iterator 역할을 만들어내는 인터페이스
*/
public interface Aggregate {
public abstract Iterator<Book> createIterator();
}
✅BookShelf 책을 보관할 객체
package bookshelf;
import java.util.Iterator;
/***
* Aggregate의 구현체
* 실제로 책꽂이 안을 돌아다닐 Iterator를 생성하고 책꽂이를 관리하는 역할
* @author Sunro
*
*/
public class BookShelf implements Aggregate{
private Book[] books; //책의 집합
private int last =0; //마지막 책이 꽂힌 위치
private int size; //책장의 사이즈
public BookShelf(int size) {
books = new Book[size];
this.size = size;
}
public Book getBook(int index) {
if(index<size) return books[index];
return null;
}
public int getLength() {
return last;
}
//책꽂이에 책을 꽂는다.
public void appendBook(Book book) {
if(last< books.length) {
this.books[last] = book;
last++;
}
else {
System.out.println("책장이 꽉 찼습니다!");
}
}
@Override
public Iterator<Book> createIterator() {
return new BookShelfIterator(this); //Iterator를 호출하기 위한 인터페이스 구현
}
}
✅BookShelf 클래스에서 검색을 수행하는 클래스(Iterator를 상속받아 구현)
📌Iterator를 상속받은 경우 내부에 있는 미구현 클래스를 구현해주어야 한다.
package bookshelf;
import java.util.Iterator;
public class BookShelfIterator implements Iterator<Book> {
private BookShelf bookShelf; //검색을 수행할 책꽂이
private int index=0; //현재 처리할 책의 위치
public BookShelfIterator(BookShelf bookShelf) {
this.bookShelf = bookShelf;
}
@Override
public boolean hasNext() {
return index < bookShelf.getLength();
}
@Override
public Book next() {
Book book = bookShelf.getBook(index);
index++;
return book;
}
}
✅완성된 책장 활용해보기(Main 클래스)
package bookshelf;
import java.util.Iterator;
public class library {
public static void main(String[] args) {
BookShelf bookShelf = new BookShelf(10);
Book book1 = new Book("book1");
Book book2 = new Book("book2");
Book book3 = new Book("book3");
bookShelf.appendBook(book1);
bookShelf.appendBook(book2);
bookShelf.appendBook(book3);
System.out.println("현재 꽃혀있는 책 : " + bookShelf.getLength()+"권");
Iterator<Book> it = bookShelf.createIterator();
while(it.hasNext()) {
Book book = (Book)it.next();
System.out.println(book.getName());
}
}
}
🟰Iterator의 장점? for을 놔두고 굳이 Iterator을 쓰는 이유?
📌 Iterator는 하나씩 꺼내서 순차적으로 처리하는 과정을 구현과 분리할 수 있다.
⏬Iterator를 사용했을 때
📌Book의 메서드를 사용하지 않고 Iterator의 메서드를 사용하고 있다.
while (it.hasNext()) {
Book book = (Book) it.next();
System.out.println(book.getName());
}
⏬for문을 사용했을 때
📌book클래스의 메서드를 직접 호출하고 있다.
for (int i = 0; i < bookShelf.getLength(); i++) {
System.out.println(bookShelf.getBook(i).getName());
}
⭐⭐⭐Iterator는 해당 객체의 구현에 의존하지 않는다.
BookShelf의 내용을 수정하더라도 BookShelf가 Iterator에 제대로 반환만 된다면 Main을 수정할 필요가 없다는 것이다.
🟰요약
📌Iterator 패턴은 어떠한 타입, 값의 집합을 순차적으로 갖고 와서 처리하는 방식
📌Iterator 인터페이스를 사용하는 경우는 요소를 순서대로 검색하는 경우
📌ConcreteIterator(구체적인 반복자) : Iterator가 결정한 인터페이스를 실제로 구현하고, 검색에 필요한 정보를 갖고 있어야 한다.
📌ConcreteAggregate(구체적인 집합체) : Aggregate역할을 결정한 인터페이스를 실제로 구현한다.
728x90
반응형
'JAVA-기초 > Design Pattern' 카테고리의 다른 글
[Design Pattern / Java] Template Method패턴 (1) | 2024.03.28 |
---|---|
[Design Pattern / Java] Factory Method(공장처럼 찍어내는 인터페이스) (0) | 2024.03.22 |
[Design Pattern] - Adapter 패턴 (92) | 2023.09.03 |