객체에 있는 자료구조를 접근할 때, 직접 객체에 접근하여 반복문을 사용하여 자료를 검색한다. 그럼 이터레이터 패턴을 사용해서 자료구조를 순회하는 이유는 무엇일까?
이터레이터 패턴(Iterator Pattern)이란?
이터레이터 패턴은 컬렉션의 내부 구조를 노출하지 않고, 그 안의 요소를 순차적으로 접근할 수 있게 해주는 디자인 패턴이다. 컬렉션이 어떤 방식으로 데이터를 담고 있든, 우리는 그 구조를 몰라도 next() 함수로 다음 데이터를 알아 낼 수 있다.
구현
// 집합 인터페이스
interface Aggregate {
Iterator createIterator();
}
// 이터레이터 인터페이스
interface Iterator {
boolean hasNext();
String next();
}
// 책장 클래스
class BookShelf implements Aggregate {
private String[] books;
private int size = 0;
public BookShelf(int capacity) {
books = new String[capacity];
}
public void addBook(String book) {
books[size++] = book;
}
public String getBookAt(int index) {
return books[index];
}
public int getLength() {
return size;
}
@Override
public Iterator createIterator() {
return new BookShelfIterator(this);
}
}
// 책장을 순회하는 이터레이터
class BookShelfIterator implements Iterator {
private BookShelf bookShelf;
private int index = 0;
public BookShelfIterator(BookShelf bookShelf) {
this.bookShelf = bookShelf;
}
@Override
public boolean hasNext() {
return index < bookShelf.getLength();
}
@Override
public String next() {
return bookShelf.getBookAt(index++);
}
}
// 사용 예시
public class Main {
public static void main(String[] args) {
BookShelf shelf = new BookShelf(5);
shelf.addBook("Book1");
shelf.addBook("Book2");
shelf.addBook("Book3");
Iterator it = shelf.createIterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
이렇게 이터레이터 패턴을 만들어 놓으면 다른 집합으로 확장시켜서 그 객체에서도 그 안의 집합의 구조를 모르더라도 next() 함수로 그 안에있는 요소들을 확인할 수 있다.
장점 | 설명 |
내부 구조를 몰라도 순회 가능 | 배열이든 리스트든 상관없이 next()로 순회 가능 |
일관된 인터페이스 제공 | 다양한 컬렉션이 동일한 방식으로 반복 처리 가능 |
SRP(단일 책임 원칙) 준수 | 컬렉션과 순회 로직을 분리해 관리할 수 있음 |
커스터마이징 용이 | 순서 반대 순회, 특정 조건 필터링 등도 구현 가능 |
어떤 문제 상황에서 잘 활용할 수 있을까?
보통 이터레이터 패턴은 동일한 순회를 반복해야 하는 상황이거나 여러가지 컬렉션이 합쳐져 있는 복잡한 객체의 내부 상황을 알지 않아도 될 때 사용하면 편리하다.
하지만 작은 프로젝트나 단순한 객체 구조같은 경우에는 오버엔지니어링으로 느껴질 수 있다.
'JAVA' 카테고리의 다른 글
[JAVA] 코드의 재사용을 상속(Inheritance)으로 모두 해결할 수 있을까? (4) | 2025.06.11 |
---|---|
[JAVA] 프록시 패턴(Proxy Pattern)과 데코레이터 패턴(Decorator Pattern) (0) | 2025.06.10 |
[JAVA] 옵저버 패턴(Observer Pattern)이란? (0) | 2025.05.23 |
[JAVA] 전략 패턴(Strategy Pattern)이란? (1) | 2025.05.23 |
[JAVA] 팩토리 패턴(Factory Pattern)이란? (0) | 2025.05.22 |