Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
Tags
- 우유가옆으로넘어지면아야
- I am Korean
- Java 환경 설정
- 수학
- 텐션 업 10기 화이팅
- 자료구조
- DP
- Have a nice day.
- DFS
- SSAFY IM/A
- have a nice day
- 우유가 옆으로 넘어지면 아야
- HAVE A GOOD DAY
- 코로나 싫어요
- LeetCode #릿코드 #좋은 하루 되세요 #Have a nice day
- 자고 싶다
- BFS
- Hamming weight
- 텐션 업 10기!
- SSAFY 10기 화이팅
- Have a good day :)
- 네트워크
- SSAFY 화이팅
- SSAFY 테스트
- amazon
- 아자아자 화이팅
- 모르고리즘
- 우유아야
- SeongSeobDang
Archives
- Today
- Total
Hope Everyone Is Happy
6. 이터레이터 패턴 본문
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 |