이터레이터 패턴 (Iterator Pattern)

리스트같은 집합 객체(데이터 군)들의 내부표현 구조들을 노출시키지 않고 원소들을 반복자(Iterator)를 이용하여 접근하는 패턴입니다. 이 패턴을 이용하면 집합체 내에서 어떤 식으로 일이 처리되는지에 대해서 전혀 모르는 상태에서 그 안에 들어있는 모든 항목들에 대해서 반복작업을 수행할 수 있습니다. 복합 객체 요소들의 내부 표현 방식은 공개하지 않고 순차적인 접근 방법을 제공하는 패턴. (반복을 캡슐화)

Iterator 패턴의 구성

  • Iterator Iterator 인터페이스는 요소를 하나씩 나열하면서 루프 변수와 같은 역할을 수행합니다.

  • Aggregate 인터페이스는 요소들이 나열되어 있는 ‘집합체’를 나타냅니다. 이 인터페이스를 구현하고 있는 클래스는 배열과 같이 무엇인가가 많이 모여있습니다. aggregate는 ‘모으다’, ‘모이다’, ‘집합’이라는 의미입니다.

screenshot

  1. Aggregate 인터페이스 - 집합체를 나타내는 인터페이스
  2. Iterator 인터페이스 - 하나씩 나열하면서 검색을 실행하는 인터페이스
  3. Book 클래스 - 책을 나타내는 클래스
  4. BookShelf 클래스 - 서가를 나타내는 클래스
  5. BookShelfIterator 클래스 - 서가를 검색하는 클래스
  6. Main 클래스 - 동작 테스트용 클래스

Iterator 패턴을 사용하는 이유

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

Iterator in JS

ES5 에서는 배열을 순회하기 위해서는 아래와 같은 형태로 이용하곤 했습니다.

for (var index = 0; index < myArray.length; index++) {
  console.log(myArray[index]);
}

ES5 발표 이후에는 forEach 메소드를 쓸 수 있게 되었지만 iterator 개념처럼 완벽하게 이터레이터의 기능을 이용할 수는 없습니다.

myArray.forEach(function (value) {
  console.log(value);
});
for-of Loop

ES2015부터 iterator 기능이 추가되었으며 아래와 같은 형태로 이용이 가능합니다.

let iterable = [1, 2, 3];
for (let item of iterable) {
    console.log(item); // 1, 2, 3
}

let iterable2 = new Set([4, 5, 6]);
for (let item of iterable2) {
    console.log(item); // 4, 5, 6
}

let iterable3 = '789';
for (let item of iterable3) {
    console.log(item); // '7', '8', '9'
}
  • Low-level iterator consumption
let iterable = ['a', 'b', 'c'];

// Explicit "low-level" iterator consumption:
let iterator = iterable[Symbol.iterator]();
iterator.next(); // { value: 'a', done: false }
iterator.next(); // { value: 'b', done: false }
iterator.next(); // { value: 'c', done: false }
iterator.next(); // { value: undefined, done: true }

  • 내용 발췌 : Head First Design Pattern

컴포지트 패턴 (Composite Pattern)

객체들을 트리(Tree) 구조로 구성하여 부분-전체 계층구조를 구현합니다. 이 패턴을 이용하면 Client 에서 개별 객체와 복합 객체(Composite)를 똑같은 방법으로 다루도록 할 수 있습니다.

템플릿 메소드 패턴 (template method pattern)

템플릿 메소드 패턴은 어떤 작업 알고리즘의 골격을 정의합니다. 일부 단계는 서브 클래스에서 구현하도록 할 수 있습니다.
상위 클래스에서는 처리할 구조를 결정하고 하위 클래스에서 구체적인 내용을 정의하는 디자인 패턴을 말합니다.
하위 클래스에서 어떤 구현을 해도 처리의 실제 큰 흐름은 상위 클래스가 결정한대로 정의를 해야 됩니다.
템플릿 메소드를 이용하면 알고리즘 구조는 그대로 유지하면서 특정 단계만 서브 클래스에서 새로 정의하도록 할 수 있습니다.

2016 Self Review

올해가 가기 전에 간단히 올해의 이슈들을 중심으로 한해를 리뷰 해 보고자 글을 정리한다.
매년 비슷한 생각들은 줄곧 해왔지만, 기록해 두지 않았더니 어렴풋해지고 남질 않아 올해부터는 기록해 두기로 마음을 먹었다. 억지로라도 습관을 들이면 괜찮아 질거 같다.

커맨드 패턴 (command pattern)

커맨드패턴을 이용하면 요구사항을 객체로 캡슐화 할수 있으며, 매개변수를 써서 여러가지 다른 요구사항을 집어넣을 수도 있습니다. 또한 요청내역을 큐에 저장하거나 로그로 기록할 수도 있으며, 작업취소 기능도 지원 가능합니다.

싱글턴 패턴 (singleton pattern)

소프트웨어를 디자인 하다보면 하나만 있으면 되는 객체들이 있습니다.
어플리케이션의 생명주기 안에서 단 하나의 클래스에 단 하나의 인스턴스만 생성하는 것을 싱글톤 패턴이라고 합니다.
유틸과 같은 공통으로 사용하는 클래스에 적용하면 알맞을 것입니다.

해당 클래스의 인스턴스가 하나만 만들어지고, 어디서든지 그 인스턴스에 접근할 수 있도록 하기 위한 패턴.

팩토리 패턴 (Factory Pattern)

팩토리 패턴의 목적은 객체들을 생성하는 것입니다.
팩토리 패턴은 흔히 클래스 내부 또는 클래스의 스태틱 메서드로 구현되며 다음과 같은 목적으로 사용됩니다.

옵저버 패턴 (Observer Pattern)

디자인 패턴의 정리를 위해 글 작성을 시작했습니다.
기본적인 패턴이자 널리 사용되는 패턴중 하나인 옵저버 패턴을 정리 해 보았습니다.

About

Profile

  • 이름: 이진권
  • 닉네임: Mystic / 은빛소나기
  • Contact: master@bdyne.net
  • 좌우명 : 자기 개발을 멈추면 죽는다.
  • Github: https://github.com/Jinkwon
  • Blog: http://bdyne.net
  • SlideShare: http://www.slideshare.net/jinkwonlee52