JAVA-기초/Design Pattern

[Java] Design Pattern - Iterator ,For 반복문의 차이

공부하고 기억하는 공간 2023. 8. 20. 21:48
728x90
반응형
SMALL

🟰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
반응형
SMALL