목 차
Iterator : 순서대로 지정해서 처리하기
객체 내부 구조를 노출하지 않고도 그 안의 요소들을 순차적으로 접근할 수 있는 방법을 제공한다. 컬렉션(Collections) 객체가 가지고 있는 는 요소들에 순서대로 접근하여 처리를 반복한다.
Iterator 패턴의 구성 요소
1. Iterator(반복자)
- 요소에 순차적으로 접근하는 인터페이스를 정의. 주로 hasNext()와 next() 메서드가 포함됨
2. ConcreteIterator(구체적인 반복자)
- Iterator 인터페이스를 실제로 구현하여 컬렉션 객체의 요소를 하나씩 접근하는 역할
3. Aggregate(집합체)
- Iterator 객체를 생성하는 인터페이스를 정의
4. ConcreteAggregate(구체적인 집합체)
- Aggregate 인터페이스를 구현하며, Iterator 인터페이스를 구현하는 구체적인 반복자를 반환하는 메서드를 갖고 있음
Iterator 패턴의 특징
컬렉션 변경 및 확장 용이성
- Iterator 패턴을 사용하면, 컬렉션의 내부 구조와 상관 없이 요소들을 순회하여 접근할 수 있다.
- hasNext(), next() 같은 일관된 메서드를 사용해, 컬렉션이 어떤 형태이든 동일 방식으로 접근 가능하다.
- 컬렉션 추가나 변경에 관계 없이 인터페이스를 따르기만하면 되기 때문에 애플리케이션의 구조 변경이 용이하고, 유지보수가 간편해진다.
캡슐화 유지
- 컬렉션의 내부에서 어떻게 처리가 이루어지는 알지 않고도 순회 작업을 처리하고, 또한 외부로 노출되지 않기 때문에 객체 지향 프로그래밍의 캡슐화 특성을 유지할 수 있다.
단일 책임 원칙
- 컬렉션 객체는 데이터 관리에 집중하고 Iterator는 데이터를 순회하는 데 집중하기 때문에, 단일 책임 원칙을 지킬 수 있다.
Iterator 패턴의 구현 예시 : 책장(Bookshelf)와 책(Book)
1. Book 클래스
public class Book {
private String name;
public Book(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
- 책의 제목을 저장하고 이를 반환하는 역할을 한다.
2. Bookshelf 클래스
import java.util.ArrayList;
import java.util.List;
public class Bookshelf {
private List<Book> books;
public Bookshelf() {
this.books = new ArrayList<>();
}
public void addBook(Book book) {
books.add(book);
}
public Book getBookAt(int index) {
return books.get(index);
}
public int getLength() {
return books.size();
}
public BookshelfIterator iterator() {
return new BookshelfIterator(this);
}
}
- 책들을 저장하는 집합체로서, Iterator를 생성하는 메서드를 포함한다.
3. Iterator 인터페이스
public interface Iterator {
boolean hasNext();
Object next();
}
- hasNext()와 next() 메서드를 가지고 다음 요소가 있는지 확인하고(hasNext), 다음 요소를 가져오는(Next) 역할을 한다.
4. BookshelfIterator 클래스
public class BookshelfIterator implements Iterator {
private Bookshelf bookshelf;
private int index;
public BookshelfIterator(Bookshelf bookshelf) {
this.bookshelf = bookshelf;
this.index = 0;
}
@Override
public boolean hasNext() {
return index < bookshelf.getLength();
}
@Override
public Object next() {
Book book = bookshelf.getBookAt(index);
index++;
return book;
}
}
- Iterator 인터페이스를 구현하여 Bookshelf 객체의 요소들을 하나씩 순차적으로 접근한다.
5. 클라이언트 코드
public class Main {
public static void main(String[] args) {
Bookshelf bookshelf = new Bookshelf();
bookshelf.addBook(new Book("Java Programming"));
bookshelf.addBook(new Book("Design Patterns"));
bookshelf.addBook(new Book("Data Structures"));
Iterator iterator = bookshelf.iterator();
while (iterator.hasNext()) {
Book book = (Book) iterator.next();
System.out.println(book.getName());
}
}
}
- Bookshelf 객체를 생성하고 책을 추가한 뒤, BookshelfIterator를 통해 책장을 순회하며 각 책의 제목을 출력한다.
Ref.
- 책 『JAVA 언어로 배우는 디자인 패턴 입문: 쉽게 배우는 GoF의 23가지 디자인 패턴』 (저자 : 유키 히로시 저 / 번역 : 김성훈 역, 영진닷컴)
- https://inpa.tistory.com/entry/GOF-%F0%9F%92%A0-%EB%B0%98%EB%B3%B5%EC%9E%90Iterator-%ED%8C%A8%ED%84%B4-%EC%99%84%EB%B2%BD-%EB%A7%88%EC%8A%A4%ED%84%B0%ED%95%98%EA%B8%B0#%EC%9D%B4%ED%84%B0%EB%A0%88%EC%9D%B4%ED%84%B0_%ED%8C%A8%ED%84%B4_%ED%8A%B9%EC%A7%95
'_ 개발' 카테고리의 다른 글
[DESIGN PATTERN/JAVA] Template Method - 템플릿 메서드 패턴 (3) | 2024.11.13 |
---|---|
[DESIGN PATTERN/JAVA] Adapter - 어댑터 패턴 (2) | 2024.11.11 |
[DESIGN PATTERN/JAVA] Factory Method - 팩토리 메서드 패턴 (1) | 2024.11.09 |
객체 지향 설계 원칙 5가지 - SOLID (2) | 2024.11.08 |
[DESIGN PATTERN/JAVA] Singleton - 싱글톤 패턴 (4) | 2024.11.01 |