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

게시글

강좌40 - JavaScript - 2년 전 등록

디자인 패턴(플라이급, flyweight)

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

안녕하세요. 이번 시간에는 플라이급 패턴에 대해서 알아보겠습니다. 패턴이 참 많죠? 아직 반도 안 왔습니다. 패턴이야 만들기 나름이니까요. 플라이급 패턴은 꼭 알아둬야 하는 패턴입니다. 이름은 생소하지만 복합체 패턴처럼 모두가 써 본 패턴입니다. 이번에도 안 써봤다고요? ...

생성자 객체를 하나 만들어보죠. 객체는 병사입니다. 이전 시간에 군단과 그 하부 조직을 만들었다면, 이번 시간은 병사 개개인을 만들겠습니다. 로마에는 군단이 수십 개가 있고 각 군단에 최소 4800명이 있으니 병사 객체를 5만 개 정도 만들면 되겠네요...

병사는 사람이니만큼 각각 개성도 있습니다. 이름도 다를 거고, 운동 능력도 다를 거고, 나이도 다를 겁니다. 하지만 이 많은 특성들을 모두 컴퓨터에 반영하면 컴퓨터가 터지겠죠? 그래서 어쩔 수 없이 일부는 희생하는 겁니다. 대부분의 게임을 보면 병사들은 능력치가 다 똑같죠. 이름도 똑같은 경우가 많고요. 그래도 우리는 너그러우니까 이름 정도는 개성을 살려줍시다. 대신 나머지 특성들은 모두 다 같아야 합니다. 객체들끼리 서로 공유하는 거죠.

var Legionary = (function() {
  function Legionary(name) {
    this.name = name;
    this.hp = 50;
    this.att = 5;
    this.attack = function(target) {
      console.log(this.name + '가 ' + target + '를 공격합니다.');
    };
  }
  return Legionary;
})();

처음에는 주로 위와 같이 객체를 만들었습니다. 그러다 사람들이 this.attack 메소드가 객체를 생성할 때마다 메모리를 잡아먹는 다는 것을 깨닫습니다. 그래서 다음과 같이 수정합니다.

var Legionary = (function() {
  function Legionary(name) {
    this.name = name;
    this.hp = 50;
    this.att = 5;
  }
  Legionary.prototype.attack = function(target) {
    console.log(this.name + '가 ' + target + '를 공격합니다');
  };
  return Legionary;
})();

이렇게 메소드를 prototype으로 빼는 거죠. 이제 모든 객체가 하나의 프로토타입을 공유하고 있기 때문에 메소드는 프로토타입 안에 있는 것 단 한 번만 만들어집니다. 여기까지는 익숙하죠? 여기서 한 발 더 나아가서 아예 이름을 제외한 모든 속성을 프로토타입으로 넘겨줍니다.

var Legionary = (function() {
  function Legionary(name) {
    this.name = name;
  }
  Legionary.prototype.hp = 50;
  Legionary.prototype.att = 5;
  Legionary.prototype.attack = function(target) {
    console.log(this.name + '가 ' + target + '를 공격합니다');
  };
  return Legionary;
})();

이렇게 되면 병사들 간의 속성이 프로토타입으로 다 넘어가 메모리를 많이 아낄 수 있습니다. 이제는 각 객체는 이름만 따로 가지고 있으면 됩니다.

var soldier1 = new Legionary('Marcus');
var soldier2 = new Legionary('Tiberius');
var soldier3 = new Legionary('Zero');

병사들의 hp를 조회하고, 줄여도 보겠습니다.

soldier1.hp; // 50
soldier1.hp = 40;
soldier2.hp; // soldier1과 상관 없이 그대로 50

프로토타입을 공유하지만 solider1의 hp를 바꿔도 soldier2와는 상관 없기때문에 따로 hp를 관리할 수 있습니다. 메모리는 아끼면서 특성도 관리할 수 있는 거죠. 이것을 플라이급 패턴이라고 부릅니다.

다음 시간에는 퍼사드 패턴에 대해 알아보겠습니다.

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

댓글

아직 댓글이 없습니다.