GoF 디자인 패턴 - Iterator

Clean Code Big Poo·2025년 5월 7일
0

Java

목록 보기
15/15
post-thumbnail

Overview

  • 동일한 형태의 데이터 항목을 여러개 가지고 있는 것을 Container / Aggregator 라고 함.
    Ex. Array, Linked List, Tree, Graph, Table
  • Aggregator에 있는 데이터를 하나씩 가져올 때, 종류에 따라 방법이 달라짐. 이는 Aggregator의 내부 자료구조가 종류에 따라 다르기 때문.
    Ex. Array 는 index로 접근
    Ex. Linked List는 첫번째 데이터에서 연결된 데이터를 가져오는 방식으로 접근

    Aggregator의 종류에 상관없이 데이터를 하나씩 가져올 수 있는 패턴을 의미

Array Iterator 적용

Class Diagram

Class Diagram : 클래스 간의 관계를 나타낸 다이어그램.
UML 에서 정의한 다이어그램 중 하나

Aggregator(interface)
Iterator(interface)
Array(class)
ArrayInterator(class)
Item(class)

  • Aggregator가 Iterator를 생성한다.(+create)
  • Aggregator의 메소드를 Array에서 구현한다.(선)
  • Iterator의 메소드를 ArrayInterator에서 구현한다.(선)
  • ArrayInterator가 Array를 필드로써 가진다.(하얀 화살표)
    • 생명 주기가 별개(다이아 표시가 있는 쪽이 소유주)
  • Array가 Item을 필드로써 가진다.(검은 화살표)
    • 생명 주기를 함께 함(다이아 표시가 있는 쪽이 소유주)
  • Array가 Item를 여러개 가질수 있다.(*)

예제

Iterator.java

public interface Iterator {
    ///  Aggregator의 다음 구성 데이터를 얻을 수 있음
    /// 다음 구성이 얻을 수 있으면 true
    /// 얻을 수 없으면 false
    boolean next();

    ///  구성 데이터를 받아 리턴함.
    Object current();
}

Aggregator.java


// Aggregator가 Iterator를 생성한다.
public interface Aggregator {
    Iterator iterator();
}

Item.java

public class Item {
    private String name;
    private int cost;

    public Item(String name, int cost){
        this.name = name;
        this.cost = cost;
    }

    @Override
    public String toString(){
        return "("+name+", "+cost+")";
    }
}

Array.java

// Aggregator의 메소드를 Array에서 구현한다.
public class Array implements Aggregator{
	// Array가 Item을 필드로써 가진다.
    // Array가 Item를 여러개 가질수 있다.
    private Item[] items;

    public  Array(Item[] items){
        this.items = items;
    }

    public Item getItem(int index){
        return items[index];
    }

    public  int getCount(){
        return items.length;
    }

    @Override
    public Iterator iterator() {
        return new ArrayIterator(this);
    }
}

ArrayIterator.java

//Iterator의 메소드를 ArrayInterator에서 구현한다.
public class ArrayIterator implements Iterator {
    private Array array;
    private int index;

    public ArrayIterator(Array array){
        this.array = array;
        this.index = -1; // 현재 가르키는 구성 데이터의 인덱스
    }

    @Override
    public boolean next() {
        index++;
        return index < array.getCount();
    }

    @Override
    public Object current() {
        return array.getItem(index);
    }
}

Main.java

//import java.lang.reflect.Array;
//import java.util.*;
// 기존 패키지를 사용하면 같은 이름으로 충돌

public class Main {
    public static void main(String[] args) {
        Item[] items = {
                new Item("CPU", 1000),
                new Item("Keyboard", 1000),
                new Item("Mouse", 1000),
                new Item("HDD", 1000),
        };

        Array array = new Array(items);
        Iterator it = array.iterator();

        while (it.next()){
            Item item = (Item)it.current();
            System.out.println(item);
        }
    }
}

// 결과
(CPU, 1000)
(Keyboard, 1000)
(Mouse, 1000)
(HDD, 1000)

0개의 댓글