컬렉션 구현 방법을 노출시키지 않으면서, 그 집합체 안에 들어있는 모든 항목에 접근할 수 있는 방법을 제공하는 패턴
컬렉션 객체 안에 들어있는 모든 항목에 접근하는 방식이 통일되어 있으면 어떤 종류의 집합체에 대해서도 사용할 수 있는 다형적인 코드를 만들 수 있다.
이터레이터패턴을 사용하면 모든 항목에 일일이 접근하는 작업을 컬렉션 객체가 아닌 반복자 객체에서 맡게 된다. 이렇게 하면 집합체의 인터페이스 및 구현이 간단해질 뿐 아니라 집합체에서는 반복작업을 신경쓰지 않고 자신이 할 일에만 집중할 수 있다.
스터디 그룹에 참여하는 학생들에 대한 정보를 갖는 StudyGroup객체에 대한 접근을 이터레이터패턴을 적용하여 순차적으로 검색해보자!
// Aggregate.java
public interface Aggregate {
public abstract Iterator iterator();
}
// Iterator.java
public interface Iterator {
public abstract boolean hasNext();
public abstract Object next();
}
// Student.java
public class Student {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
// StudyGroup.java
public class StudyGroup implements Aggregate {
private Student[] students;
private int num = 0;
public StudyGroup(int num) {
this.students = new Student[num];
}
public Student getStudent(int index) {
return students[index];
}
public void AddStudent(Student student) {
this.students[num] = student;
num++;
}
public int getLength() {
return num;
}
public StudyGroupIterator iterator() {
return new StudyGroupIterator(this);
}
}
// StudyGroupIterator.java
public class StudyGroupIterator implements Iterator {
private StudyGroup studygroup;
private int index;
public StudyGroupIterator(StudyGroup studygroup) {
this.studygroup = studygroup;
this.index = 0;
}
public boolean hasNext() {
if(index < studygroup.getLength()) {
return true;
}
return false;
}
public Object next() {
Student student = studygroup.getStudent(index);
index++;
return student;
}
}
// Client.javva
public class Client {
public static void main(String args[]) {
StudyGroup studygroup = new StudyGroup(4);
studygroup.AddStudent(new Student("권지훈", 27));
studygroup.AddStudent(new Student("고다은", 27));
studygroup.AddStudent(new Student("정찬민", 27));
studygroup.AddStudent(new Student("박지희", 27));
StudyGroupIterator iterator = studygroup.iterator();
while(iterator.hasNext()) {
Student student = (Student)iterator.next();
System.out.println("이름:" + student.getName());
System.out.println("나이:" + student.getAge());
}
}
}
위 코드를 통해 집합체 내에서 어떤 식으로 일이 처리되는지 전혀 모르는 상태에서도 모든 항목들에 대해서 반복작업을 수행할 수 있다는 것을 확인할 수 있다.