9장 : 반복자 패턴과 컴포지트 패턴

  • 반복 작업을 캡슐화

  • 컬렉션이라는 것은 객체를 모아놓은 것에 불과하다. 리스트, 배열, 해시테이블과 같이 다양한 자료 구조에 보관할 수 있는데, 어떤 자료 구조를 사용하든 결국 컬렉션은 컬렉션이다. 컬렉션을 집합체(aggregate)라고 부르기도 한다.

이터레이터 패턴의 정의

  • 이터레이터 패턴은 컬렉션 구현 방법을 노출시키지 않으면서도 그 집합체 안에 들어있는 모든 항목에 접근할 수 있게 해주는 방법을 제공한다.

  • 이터레이터 패턴을 이용하면 내부적인 구현 방법을 외부로 노출시키지 않으면서도 집합체에 있는 모든 항목에 일일이 접근할 수 있습니다. 또한 각 항목에 일일이 접근할 수 있게 해주는 기능을 집합체가 아닌 반복자 객체에서 책임지게 된다느 것도 장점으로 작용한다. 그러면 집함체 인터페이스 및 구현이 간단해지고, 각자 중요한 일만 잘 처리하면 된다.

언제 사용 ?

구현 방법

장단점

단일 역할 원칙

  • 클래스를 바꾸는 이유는 한 가지 뿐이어야 한다.

  • 클래스에서는 한 가지 역할만 맡도록 해야 한다.

  • 응집도(cohesion)란 한 클래스 또는 모듈이 특정 목적 또는 역할을 얼마나 일관되게 지원하는지를 나타내는 척도라고 할 수 있다.

컴포지트 패턴의 정의

  • 컴포지트 패턴을 이용하면 객체들을 트리 구조로 구성하여 부분과 전체를 나타내는 계층구조로 만들 수 있습니다. 이 패턴을 이용하면 클라이언트에서 개별 객체와 다른 객체들로 구성된 복합 객체(composite)를 똑같은 방법으로 다룰 수 있다.

  • 컴포지트 패턴을 이용하면 객체의 구성과 개별 객체를 노드로 가지는 트리 형태로 객체를 구축할 수 있다.

  • 이런 복합(composite structure)를 사용하면 복합 객체와 개별 객체에 대해 똑같은 작업을 적용할 수 있습니다. 즉, 대부분의 경우에 복합 객체와 개별 객체를 구분할 필요가 없어진다.

언제 사용 ?

구현 방법

장단점

패턴 구분

  • 스테이트 패턴 : 어떤 상태가 바뀜에 따라 객체의 행동을 바꿀 수 있습니다.

  • 어댑터 패턴 : 하나 이상의 클래스의 인터페이스를 변환합니다.

  • 이터레이터 패턴 : 컬렉션의 구현을 드러내지 않으면서도 컬렉션에 있는 모든 객체들에 대해 반복작업을 할 수 있습니다.

  • 퍼사드 패턴 : 일련의 클래스들에 대한 인터페이스를 단순화시킵니다.

  • 컴포지트 패턴 : 클라이언트에서 객체 컬렉션과 개별 객체를 똑같은 식으로 처리할 수 있다.

  • 옵저버 패턴 : 어떤 상태가 변경되었을 때 일련의 객체들한테 연락을 할 수 있습니다.

Refactoring Guru Code & Diagram

핵심 정리

  • 반복자를 이용하면 내부 구조를 드러내지 않으면서도 클라이언트로부터 컬렉션 안에 들어있는 모든 원소들에 접근하도록 할 수 있다.

  • 이터레이터 패턴을 이용하면 집합체에 대한 반복작업을 별도의 객체로 캡슐화할 수 있다.

  • 이터레이터 패턴을 이용하면 컬렉션에 있는 모든 데이터에 대해서 반복작업을 하는 역할을 컬렉션에서 분리시킬 수 있다.

  • 이터레이터 패턴을 쓰면 다양한 집합체에 들어있는 객체에 대한 반복작업들에 대해 똑같은 인터페이스를 적용할 수 있기 떄문에, 집합체에 있는 객체를 활용하는 코드를 만들 때 다형성을 활용할 수 있다.

  • 한 클래스에는 될 수 있으면 한 가지 역할만 부여하는 것이 좋습니다.

  • 컴포지트 패턴에서는 개별 객체와 복합 객체를 모두 담아둘 수 있는 구조를 제공합니다.

  • 컴포지트 패턴을 이용하면 클라이언트에서 개별 객체와 복합 객체를 똑같은 방법으로 다룰 수 있다.

  • 복합 구조에 들어있는 것을 구성요소라고 부른다. 구성요소에는 복합 객체와 잎 노드가 있다.

  • 컴포지트 패턴을 적용할 때는 여러 가지 장단점을 고려해야 한다. 상황에 따라 투명성과 안정성 사이에서 적절한 평형점을 찾아야 한다.

Last updated