Design Pattern | Iterator Pattern (이터레이터 패턴)

Iterator 패턴이란?

  • Iterate라는 영어 단어는 무언가를 반복한다는 의미이다. Iterator는 반복자라는 의미이다.
  • Iterator 패턴은, 집합체의 요소에 대해, 차례로 액세스 하는 처리를 실시하기 위한 방식이다.
  • GoF의 디자인 패턴에서는 행위에 대한 디자인 패턴으로 분류된다.

어떠한 종류의 데이터 집합이 있다. 이 데이터를 조작, 검색 등을 하는 기능이 포함 되어있다.
이 중 검색 기능과 다른 기능이 뒤섞여 개발하면 클래스간의 결합도가 증가되어 코드가 보기가 어려워진다.
Iterator 패턴을 이용해 검색 기능을 재사용 가능 하게 만들어 보자.

Iterator 패턴 예제 프로그램

클래스(교실)에 학생을 넣어 학생의 이름을 차례로 표시하는 프로그램을 만들어 보겠다.

Class Diagram
Iterator Pattern

1. Iterator 인터페이스

요소를 순차적으로 스캔하는 인터페이스이다.

Iterator.java

package com.devkuma.designpattern.behavioral.iterator;

public interface Iterator {
    boolean hasNext();
    Object next();
}

2. Aggregate 인터페이스

Iterator를 만드는 인터페이스이다. 샘플에서는 “집합체"라고 하고 있습니다.

Aggregate.java

package com.devkuma.designpattern.behavioral.iterator;

public interface Aggregate {
    Iterator iterator();
}

3. Student 클래스

집합체의 요소가 되는 클래스입니다. 샘플에서는 ‘학생’이라고 합니다.

Student.java

package com.devkuma.designpattern.behavioral.iterator;

public class Student {

    private String name;

    public Student(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

4. ClassRoom 클래스

Aggregate가 선언한 인터페이스를 구현하는 클래스이다. 샘플에서는 “교실"이라고 하고 있다.

ClassRoom.java

package com.devkuma.designpattern.behavioral.iterator;

public class ClassRoom implements Aggregate {

    private Student[] students;
    private int last = 0;

    public ClassRoom(int maxsize) {
        this.students = new Student[maxsize];
    }

    public Student getStudentAt(int index) {
        return students[index];
    }

    public void appendStudent(Student student) {
        this.students[last] = student;
        last++;
    }

    public int getLength() {
        return last;
    }

    public Iterator iterator() {
        return new ClassRoomIterator(this);
    }
}

5. ClassRoomIterator 클래스

Iterator가 정한 인터페이스를 구현하는 클래스이다.

ClassRoomIterator.java

package com.devkuma.designpattern.behavioral.iterator;

public class ClassRoomIterator implements Iterator {

    private ClassRoom classRoom;
    private int index;

    public ClassRoomIterator(ClassRoom classRoom) {
        this.classRoom = classRoom;
        this.index = 0;
    }

    public boolean hasNext() {
        if (index < classRoom.getLength()) {
            return true;
        } else {
            return false;
        }
    }

    public Object next() {
        Student student = classRoom.getStudentAt(index);
        index++;
        return student;
    }
}

6. Main 클래스

메인 처리를 실행하는 클래스이다.

Main.java

package com.devkuma.designpattern.behavioral.iterator;

public class Main {
    public static void main(String[] args) {

        ClassRoom classRoom = new ClassRoom(4);
        classRoom.appendStudent(new Student("devkuma"));
        classRoom.appendStudent(new Student("kimkc"));
        classRoom.appendStudent(new Student("yunho"));
        classRoom.appendStudent(new Student("etkim"));

        Iterator iterator= classRoom.iterator();

        while (iterator.hasNext()) {
            Student student = (Student)iterator.next();
            System.out.println(student.getName());
        }
    }
}

7. 실행 결과

devkuma
kimkc
yunho
etkim

Iterator 패턴의 장점

Iterator 패턴의 장점은 구현과 분리되어 계산을 할 수 있다는 것 입니다. 디자인 패턴은 클래스를 부품으로 사용할 수 있게 해, 재이용성을 촉진하는 것입니다. 샘플 프로그램의 Main 클래스 로 사용되고 있는 Iterator 메소드는, hasNext(), next() 만이 됩니다. 즉, ClassRoom 클래스 에 의존하지 않는 구현이 되어 있어, 배열의 사이즈등을 신경쓰지 않아도 됩니다.