You will be fine

<디자인패턴입문> 1. Iterator 패턴

by BFine
반응형

www.yes24.com/Product/Goods/2918928

 

Java 언어로 배우는 디자인 패턴 입문

이 책은 디자인 패턴의 입문서입니다. GoF가 정리한 23개의 디자인 패턴을 하나씩 다루면서 객체 지향을 잘 모르는 초보자도 이해하기 쉽도록 정리하고 있습니다. 단순한 이론이나 논리을 제시하

www.yes24.com

저번에 책이 읽은 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이 발생한다.

반응형

블로그의 정보

57개월 BackEnd

BFine

활동하기