이 블로그는 광고 클릭 수익으로 운영됩니다!
괜찮으시다면 광고 차단을 풀어주세요 ㅠㅠ

게시글

강좌45 - JavaScript - 2년 전 등록

디자인 패턴(반복자, iterator)

조회수:
0
이 블로그는 광고 클릭 수익으로 운영됩니다!
괜찮으시다면 광고 차단을 풀어주세요 ㅠㅠ
이 블로그는 광고 클릭 수익으로 운영됩니다!
괜찮으시다면 광고 차단을 풀어주세요 ㅠㅠ

안녕하세요. 이번 시간에는 반복자 패턴에 대해 알아보겠습니다. 순서가 있는 것들(수열, 배열 등)을 편리하게 탐색할 수 있는 패턴입니다.

비텔리우스는 오토의 자결 덕분에 손쉽게 황제의 자리에 올랐습니다. 하지만 비텔리우스는 매우 무능한 인물이었기 때문에 스스로 그 명을 재촉합니다. 오토의 군단을 홀대해서 반란의 빌미를 제공한 것이죠. 오토의 군단은 유대 지방 총독인 베스파시아누스를 새 황제로 추대합니다.

베스파시아누스에게는 재밌는 일화가 있는데, 네로 황제의 밑에서 일할 때 네로 황제의 시 낭송회를 듣다가 졸아버려 섬으로 유배당해 양봉을 하게 됩니다. 처음에 네로가 정말 분노해서 그를 죽이려고 했지만, 네로 밑의 한 신하가, 오르페우스가 케르베로스를 잠들게 한 것처럼 황제가 베스파시아누스를 잠들게 했으니 네로와 오르페우스가 같은 위치에 있다는 기막힌 논리를 펼쳐 그의 목숨을 구해줍니다.

어쨌든 유배를 간 베스파시아누스에게는 수 백개의 벌집들이 기다리고 있습니다. 벌집에서 꿀을 걷고 나면 표시를 해야 하는데 벌집이 500개나 되다 보니 쉽지 않습니다. 베스파시아누스를 도와줍시다. 베스파시아누스는 계속 꿀을 걷고, 그가 "다음"이라고 말하면 다음 벌집을 넘겨주는 겁니다. 어차피 순서대로만 꿀을 걷으면 되니 어떤 벌집인지는 상관 없습니다.

var Beehives = (function() {
  function Beehives(hiveList) {
    this.hiveList = hiveList;
    this.index = 0;
  }
  Beehives.prototype.next = function() {
    console.log(this.hiveList[this.index++] + '에서 꿀을 걷습니다');
  };
  Beehives.prototype.done = function() {
    return this.hiveList.length === this.index;
  };
  return Beehives;
})();
var beehives = new Beehives(['hive1', 'hive2', 'hive3', 'hive4', 'hive5', 'hive6', 'hive7', 'hive8', 'hive9']);
beehives.next(); // hive1에서 꿀을 걷습니다
beehives.next(); // hive2에서 꿀을 걷습니다
beehives.next(); // hive3에서 꿀을 걷습니다
beehives.done(); // false
beehives.next(); // hive4에서 꿀을 걷습니다
beehives.next(); // hive5에서 꿀을 걷습니다
beehives.next(); // hive6에서 꿀을 걷습니다
beehives.next(); // hive7에서 꿀을 걷습니다
beehives.done(); // false
beehives.next(); // hive8에서 꿀을 걷습니다
beehives.next(); // hive9에서 꿀을 걷습니다
beehives.done(); // true

순서대로만 나열되면 되는 경우 반복자 패턴이 유용합니다. next로 다음 요소를 불러오고, done으로 이 배열이 끝났는지 아닌지 알 수 있습니다. done을 사용하면 반복문을 쉽게 만들 수 있습니다.

while (!beehives.done()) {
  beehives.next();
}

이 패턴은 나중에 ES2015에서 추가되어 더 편하게 사용할 수 있습니다. 링크를 참조하세요. 피보나치 수열과 팩토리얼 수열을 만드는 방법이 설명되어 있습니다. 다음 시간에는 중재자 패턴에 대해 알아보겠습니다!

투표로 게시글에 관해 피드백을 해주시면 많은 도움이 됩니다. 오류가 있다면 어떤 부분에 오류가 있는지도 알려주세요! 잘못된 정보가 퍼져나가지 않도록 도와주세요.
Copyright © 2016- 무단 전재 및 재배포 금지

댓글

아직 댓글이 없습니다.