Hope Everyone Is Happy

6. 이터레이터 패턴 본문

※ CS 스터디/디자인 패턴

6. 이터레이터 패턴

J 크 2023. 8. 2. 15:22
728x90
반응형

 재미있다~ 55

본 게시글은  : 면접을 위한 CS 전공지식 노트 (출판사 : 길벗, 주홍철 지음) 을 참조하여 작성하였습니다. + 구글링


♣ 이터레이터 패턴 ( Iterator pattern )?

 책의 내용에 따르면, 이터레이터 패턴은 이터레이터를 사용하여 컬렉션의 요소들에 접근하는 디자인 패턴입니다. 이를 통해 순회할 수 있는 여러 가지 자료형의 구조와는 상관없이 이터레이터라는 하나의 인터페이스로 순회가 가능합니다.

 일반적으로 배열에 접근 할 때는 간단한 반복문 구조를 통해 순회할 수가 있습니다. 하지만 해시 트리, 맵 등 컬렉션이나 클래스 등은 데이터 저장 순서가 정해지지 않기 때문에, 자료 컬렉션을 순회하는데 있어서 패턴의 정의가 필요. 이를 정의하는 것을 이터레이터 패턴이라고 합니다.

 아래 UML과 함께 보도록 하겠습니다.

 


♣ 예시 코드


import java.util.ArrayList;
import java.util.Iterator;

// Aggregate : 집합체를 의미하는 인터페이스
// iterator 역할을 만들어내는 인터페이스

interface Aggregate {
	public abstract Iterator createIterator();
}

class Movie {
	private String strTitle;
	
	public Movie() {}
	public Movie(String strTitle) {
		this.strTitle = strTitle;
	}
	public String getTitle() {
		return strTitle;
	}
}

// Aggregate의 구현체
class MovieManager implements Aggregate{
	private ArrayList<Movie> movieList = new ArrayList<>();
	
	public int getListSize() {
		return movieList.size();
	}
	
	public void Add(Movie movie) {
		movieList.add(movie);
	}
	
	public Movie getMovie(int nIndex) {
		if(nIndex < movieList.size())
			return movieList.get(nIndex);
		else
			return null;
	}
	
	@Override
	public Iterator createIterator() {
		// TODO Auto-generated method stub
		return new MovieIterator(this);
	}
}

// ConcreateIterator : 반복차 객체
// 어떤 전략으로 순회할지에 대한 로직을 구체화
class MovieIterator implements Iterator<Movie> {
	private MovieManager movieManager;
	private int nIndex = 0;
	
	public MovieIterator(MovieManager movieM) {
		this.movieManager = movieM;
	}
	
	@Override
	public boolean hasNext() {
		// TODO Auto-generated method stub
		return nIndex < movieManager.getListSize();
	}
	
	@Override
	public Movie next() {
		Movie movie = movieManager.getMovie(nIndex);
		nIndex++;
		return movie;
	}
}

public class IteratorPatternTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		MovieManager manager = new MovieManager();
		
		Movie m1 = new Movie("IronMan");
		Movie m2 = new Movie("SpiderMan");
		Movie m3 = new Movie("BatMan");
		
		manager.Add(m1);
		manager.Add(m2);
		manager.Add(m3);
		
		Iterator it = manager.createIterator();
		while(it.hasNext()) {
			Movie m = (Movie) it.next();
			System.out.println(m.getTitle());
		}
	}

}

 코드 내 핵심 사항 (동적으로 코드 수정이 아닌 클래스 추가를 통하여 전략 수정 )

1.  위 UML의 Aggregate 역할 (iterator 생성) 을 인터페이스로서 정의.

2.  Moviemanager 에서 Aggregate의 createIterator 구현

3.  MovieIterator 클래스에서 위 UML의 ConcreteIterator 역할을 구현. ( 순회 로직 구체화 )

4.  Main 문에서 순회 로직 테스트

 클래스를  순회 하는데에 있어서 로직을 간단하게 직접 작성하여 이터레이터 패턴 구조를 실습해보았습니다.

 

 위의 글과 관련하여 추가적인 내용이나 피드백은 언제나 환영입니다 :)

'※ CS 스터디 > 디자인 패턴' 카테고리의 다른 글

8. MVP 및 MVVM 패턴  (0) 2023.08.02
7. MVC 패턴  (0) 2023.08.02
5. 프록시 패턴 (Proxy pattern)  (0) 2023.08.02
4. 옵저버 패턴 (Observer Pattern)  (0) 2023.08.02
3. 전략 패턴 ( strategy pattern )  (0) 2023.08.02