<디자인패턴입문> 1. Iterator 패턴
by BFinewww.yes24.com/Product/Goods/2918928
저번에 책이 읽은 2021.03.14 - [개발서적/자바로 배우는 리팩토링 입문] - <자바로 배우는 리팩토링 입문> 1장~3장
요책이 괜찮았어서 같은 저자가 쓴 이 디자인패턴 책을 구매했다. 막상보니 생각보다 책이 두껍다;;
가. Iterator 패턴 이란?
a. 무엇인가
- 무엇인가 많이 모여있는 것들을 순서대로 지정하면서 전체를 검색하는 처리를 실행하는 패턴
=> 반복자 패턴이라고도 부른다.
나. 만들어본 예제
a. 클래스 다이어그램
- 여기서 <--- 는 단순 사용한다는 의미이다.
b. Iterator 인터페이스
- 요소를 하나씩 나열하면서 루프 변수와 같은 역할을 수행한다.
public interface Iterator<T> {
T next();
boolean hasNext();
}
c. Zoo 클래스
- Animal을 가진 클래스이다. 요소들을 하나의 집합체(Zoo)로 다루기 위해 Aggregate 인터페이스를 구현한다.
=> Aggregate는 가지고 있는 요소를 순서대로 검색해주는 내용을 만들어 내는 메서드를 결정하는 역할!
- 즉 요소를 집합체로 만들어 Iterator로 던져주는 클래스이다.
public interface Aggregate {
Iterator iterator();
}
public class Zoo implements Aggregate {
private Animal[] animals;
private int last = 0;
public Zoo(int maxSize) {
this.animals = new Animal[maxSize];
}
public void addAnimal(Animal animal){
animals[last++] = animal;
}
public int getLength(){
return animals.length;
}
public Animal getAnimalAt(int idx){
return animals[idx];
}
@Override
public Iterator iterator() {
return new ZooIterator(this);
}
}
d. ZooIterator 클래스
- 구체적인 반복자 역할을 담당하는 클래스이다. 검색을 위한 필요 정보를 담고 있어야 한다.
- 내용을 보면 내용을 검색할 집합체 Zoo와 Index를 가지고 있다.
public class ZooIterator implements Iterator<Animal> {
private Zoo zoo;
private int idx;
public ZooIterator(Zoo zoo) {
this.zoo = zoo;
this.idx = 0;
}
@Override
public boolean hasNext() {
if(idx < zoo.getLength()){
return true;
}
return false;
}
@Override
public Animal next() {
Animal animalAt = zoo.getAnimalAt(idx);
idx++;
return animalAt;
}
}
다. 결과
a. 실행
- Main 메서드와 실행결과이다.
- 요소를 탐색할때 Zoo와는 분리된 Iterator로 접근하는 것을 볼수있다.
public class Main {
public static void main(String[] args) {
int maxSize = 3;
Zoo zoo = new Zoo(maxSize);
zoo.addAnimal(new Animal("기린"));
zoo.addAnimal(new Animal("원숭이"));
zoo.addAnimal(new Animal("사자"));
Iterator iterator = zoo.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
b. 장점
- 단순 for문으로 확인하는 것보다 뭐가 좋은 걸까?
=> 구현체와 분리해서 요소들의 접근을 분리해서 하나씩 셀수 있다.
- 요소들을 가지고 있는 집합체에 대한 접근을 공통화 할 수 있다.
=> List, Set, Vector등
- 여기에는 구현하지 않았지만 요소 삭제에 대한 부분도 구현을 통해 만들 수 있다.
c. 한계점
- 클래스 다이어그램을 딱 봤을때 한계점이 명확하게 보인다. 책에 나와있는 부분은 아니지만 정리해야지..
- 커스텀한 집합체에 대한 접근을 만들경우 위의 예제처럼 집합체 클래스, Iterator등 구현해야한다.
- while문만 봤을때는 어떤 요소를 반환하는지 가독성이 많이 떨어진다.
d. For each 구문
- 위의 문제를 해결하기 위해 Java 1.8 부터는 우리가 자주 사용하는 for-each가 등장한다.
- 단점은 요소를 루프 내에서 remove 할경우 Exception이 발생한다.
'개발서적 > 디자인패턴입문' 카테고리의 다른 글
<디자인패턴입문> 6. Abstract Factory 패턴 (0) | 2021.04.26 |
---|---|
<디자인패턴입문> 5. Bridge 패턴 (0) | 2021.04.25 |
<디자인패턴입문> 4. Prototype 패턴 (0) | 2021.04.24 |
<디자인패턴입문> 3. Template Method 패턴 (0) | 2021.04.22 |
<디자인패턴입문> 2. Adapter 패턴 (0) | 2021.04.21 |
블로그의 정보
57개월 BackEnd
BFine