[디자인패턴] 이터레이터패턴(Iterator Pattern)

고지훈·2021년 10월 19일
1

DesignPattern

목록 보기
14/16
post-thumbnail

이터레이터패턴(Iterator Pattern)

컬렉션 구현 방법을 노출시키지 않으면서, 그 집합체 안에 들어있는 모든 항목에 접근할 수 있는 방법을 제공하는 패턴

컬렉션 객체 안에 들어있는 모든 항목에 접근하는 방식이 통일되어 있으면 어떤 종류의 집합체에 대해서도 사용할 수 있는 다형적인 코드를 만들 수 있다.

이터레이터패턴을 사용하면 모든 항목에 일일이 접근하는 작업을 컬렉션 객체가 아닌 반복자 객체에서 맡게 된다. 이렇게 하면 집합체의 인터페이스 및 구현이 간단해질 뿐 아니라 집합체에서는 반복작업을 신경쓰지 않고 자신이 할 일에만 집중할 수 있다.

  • Iterator: 집합체의 요소들을 순서대로 검색하기 위한 인터페이스 정의
  • ConcreteIterator: Iterator 인터페이스를 구현하는 클래스
  • Aggregate: 여러 요소들로 이루어져 있는 집합체
  • ConcreteAggregate: Aggreagate 인터페이스를 구현하는 클래스

이터레이터패턴 구현

스터디 그룹에 참여하는 학생들에 대한 정보를 갖는 StudyGroup객체에 대한 접근을 이터레이터패턴을 적용하여 순차적으로 검색해보자!

// Aggregate.java
public interface Aggregate  {
	public abstract Iterator iterator();
}
// Iterator.java
public interface Iterator  {
	public abstract boolean hasNext();
    public abstract Object next();
}
  • Aggregate의 인터페이스를 구현하는 복합 클래스는 반드시 iterator객체를 생성하는 메서드를 구현한다.
  • Iterator의 인터페이스를 구현하는 클래스는 접근 할 데이터가 있는지 판단하는 hasNext()와 해당 인덱스의 객체를 반환 받는 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);
    }
}
  • 실제 Student객체를 포함하는 복합 클래스이다. iterator()를 통해 iterator객체를 생성한 후 반환한다.
// 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;
    }
}
  • 실제 StudyGroup객체에 접근하기 위한 Iterator클래스이다. StudyGroup의 인스턴스를 갖고 있으며 해당 인스턴스를 통해 StudyGroup이 포함하는 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());
        }
    }
}

위 코드를 통해 집합체 내에서 어떤 식으로 일이 처리되는지 전혀 모르는 상태에서도 모든 항목들에 대해서 반복작업을 수행할 수 있다는 것을 확인할 수 있다.

profile
"계획에 따르기보다 변화에 대응하기를"

0개의 댓글