Java/Design Patterns

[자바 디자인 패턴] 이터레이터 패턴

LimeCoding 2023. 9. 1. 23:49

문제


프로그래밍을 하다보면 반복문을 많이 사용한다. 그러나 반복문이 사용되는 목적은 다양한다. 일정 횟수를 반복하는 경우도 있고 탐색을 위해 반복하는 경우도 있다. 또는 모든 요소를 수정하는 것이 목적일 수 있다. 이때 반복의 대상이 어떠냐에 따라 다양한 방식으로 반복문을 만들어야 한다. 그러면 우리는 이런 생각을 할 수 있다. 어떻게 하면 반복문을 쉽게 만들 수 있을까?

 

이터레이터 패턴이란?


위와 같은 문제를 해결할 수 있는 디자인 패턴이 바로 이터레이터(iterator) 패턴이다. 이터레이터 패턴은 반복에 사용되는 요소를 추상화한 후 이를 일반화한 패턴이다. 예를 들어 다음과 같은 코드가 주어진다고 해보자.

for(int i = 0; i < 10; i++) {
	...
}

여기서 반복을 제어하는 변수는 i이다. 이 i는 다음 요소를 가리키는 역할을 한다. 역할은 추상화에 해당된다. 이를 일반화하여 i가 어떤 객체가 오던 다음 객체를 가리킬 수 있게 해주면 된다.

 

이터레이터 패턴의 문제 해결 방법


 

이터레이터에서는 Iterator 인터페이스를 구현함으로써 반복을 일반화한다. hasNext는 다음 요소를 가지고 있는가를 알려주고 Next는 현재 요소를 반환하고 다음요소를 가리킨다. Aggregate는 iterator 함수를 이용해 반복을 제어한다.

Aggregete는 데이터 집합을 가지고 있다. 이때 반복을 하고 싶다면 Iterator를 받아 사용하면 된다.

 

구체적인 구현은 깃허브에 구현했다.

 

GitHub - LimeTree0/Java_Design_Pattern: 자바 디자인 패턴 코드입니다!

자바 디자인 패턴 코드입니다! Contribute to LimeTree0/Java_Design_Pattern development by creating an account on GitHub.

github.com

 

장점과 단점


이터레이터의 장점은 어떤 객체가 오던 상관없이 같은 방식으로 반복이 가능하다는 것이다. 이것이 가능한 이유는 반복 제어를 할 때 직접적으로 제어를 하지 않고 iterator를 이용해 제어하기 때문이다. 즉 의존을 하지 않고 제어하기 때문에 어떤 형태가 되던 반복을 제어하는 코드는 변경하지 않아도 된다.

for(int i = 0; i < 10; i++) {
	book = books[i];
    System.out.println("book = " + book.getName());
}
Iterator<Book> it = bookShelf.iterator();
while(it.hasNext()) {
            Book book = it.next();
            System.out.println("book = " + book.getName());
        }

위 코드를 보면 books는 배열이다. 하지만 List형태로 바뀐다면 반복문 내부의 books를 List 형태로 바꾸어야 한다. 하나면 괜찮지만 저런 반복문이 수 백개가 존재한다면 일일이 바꾸기 힘들다. 그러나 아래 iterator는 직접적으로 배열에 접근하고 있지 않다. 결국 변화가 생기면 iterator 내부만 적절히 고쳐주면 반복문은 손대지 않아도 된다.

 

하지만 단점으로는 iterator구현만 봐도 일반 반복문보다는 복잡하다. 즉 반복이 코드에 많이 사용되지 않으면 그냥 반복문을 사용하는 것보다 많은 비용이 든다. 이는 프로그래머가 적절히 판단하여 어떤 방식으로 구현해야 할지 결정해야 한다.

 

참고자료


  • JAVA 언어로 배우는 디자인 패턴 입문 3판, 영진닷컴, 유키 히로시 저, 김성훈 역, 2022

'Java > Design Patterns' 카테고리의 다른 글

[자바 디자인 패턴] 싱글톤 패턴  (0) 2023.08.15