08 반복자 패턴 (Iterator Pattern)

2021. 12. 13. 14:11 JAVA/Design Patterns

반복자 패턴 (Iterator Pattern)


접근기능과 자료구조를 분리시켜서 객체화합니다. 서로 다른 구조를 가지고 있는 저장 객체에 대해서 접근하기 위해서 interface를 통일시키고 싶을 때 사용하는 패턴입니다.

 

 동기


for(int i=0;i<arr.length;i++)

{

System.out.println(arr[i]);

}

 

다음과 같이 배열 요소에 접근하기 위한 반복문이 있습니다. 여기서 arr의 타입이 배열이 아닌 다른 자료 구조로 바뀐다면 이 반복문은 수정이 되어야 합니다. Iterator는 이러한 자료구조에 상관없이 객체 접근 방식을 통일시키고자 할 떄 사용됩니다.

 

 Iterator Pattern Structure


 

 

● Iterator : 집합체의 요소들을 순서대로 검색하기 위한 인터페이스 정의

 

● ConcreateIterator : Iterator 인터페이스를 구현함

 

● Aggregate : 여러 요소들로 이루어져 있는 집합체

 

● ConcreateAggregate : Aggreagate 인터페이스를 구현하는 클래스

 

 예제


 

 Study_Group : 다수의 Student 객체를 가지는 복합 클래스입니다.

 

 StudyGroupIterator : 복합 객체와는 분리되면서 복합 객체에 순차적으로 접근하기 위한 iterator

 

예제는 스터디 그룹에 참여하는 학생들에 대한 정보를 가지는 Study_Group 객체에 대한 접근을 Iterator 패턴을 적용하여 순차적으로 검색하는 예제입니다.

 

Aggregate.interface 와 Iterator.interface

public interface Aggregate {
    public abstract Iterator iterator();
}
 
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;
    }
}

 

복합 클래스가 가지는 학생 정보를 가지고 있는 데이터 객체입니다.

 

Study_Group.java

public class Study_Group implements Aggregate{
    
    private Student[] Students;
    private int num =0;
    
    public Study_Group(int num)
    {
        this.Students = new Student[num];
    }
    public Student getStudent(int index)
    {
        return Students[index];
    }
    public void AddStudnet(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 Study_Group study_group;
    private int index;
    
    public StudyGroupIterator(Study_Group study_group)
    {
        this.study_group =study_group;
        this.index = 0;
    }
    
    public  boolean hasNext()
    {
        if(index < study_group.getLength())
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    public Object next()
    {
        Student student = study_group.getStudent(index);
        index++;
        return student;
    }
}
 

실제 Study_Group 객체에 접근하기 위한 Iterator 클래스입니다. Study_Group 의 인스턴스를 가지고 있으며 해당 인스턴스를 통해  Study_Group가 포함하는 Student 객체에 접근을 하고 있습니다.

 

Main.java

 
public class Main {
    
    public static void main(String argsp[])
    {
        Study_Group study_group = new Study_Group(5);
        study_group.AddStudnet(new Student("이기택",27));
        study_group.AddStudnet(new Student("최민수",27));
        study_group.AddStudnet(new Student("원빈",27));
        study_group.AddStudnet(new Student("홍길동",27));
        study_group.AddStudnet(new Student("나비",27));
        
        StudyGroupIterator iterator = study_group.iterator();
        
        while(iterator.hasNext())
        {
            Student student = (Student)iterator.next();
            System.out.println("이름:" + student.getName());
            System.out.println("나이:" + student.getAge());
            System.out.println("------------------");
        }
    }
}

Iterator를 통해 데이터에 접근하는 main 영역입니다.

 

 

 

출처 : https://lktprogrammer.tistory.com/40?category=672216