게시글

5만명이 선택한 평균 별점 4.9의 제로초 프로그래밍 강좌! 로드맵만 따라오면 됩니다! 클릭
강좌40 - JavaScript - 8년 전 등록

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

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

생성자 객체를 하나 만들어보죠. 객체는 병사입니다. 이전 시간에 군단과 그 하부 조직을 만들었다면, 이번 시간은 병사 개개인을 만들겠습니다. 로마에는 군단이 수십 개가 있고 각 군단에 최소 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를 관리할 수 있습니다. 메모리는 아끼면서 특성도 관리할 수 있는 거죠. 이것을 플라이급 패턴이라고 부릅니다.

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

조회수:
0
목록
투표로 게시글에 관해 피드백을 해주시면 게시글 수정 시 반영됩니다. 오류가 있다면 어떤 부분에 오류가 있는지도 알려주세요! 잘못된 정보가 퍼져나가지 않도록 도와주세요.
Copyright 2016- . 무단 전재 및 재배포 금지. 출처 표기 시 인용 가능.
5만명이 선택한 평균 별점 4.9의 제로초 프로그래밍 강좌! 로드맵만 따라오면 됩니다! 클릭

댓글

2개의 댓글이 있습니다.
5년 전
아! 이름대로 가벼운것! 👍
6년 전
마지막 40으로 바꿨을때 다른객체의 hp는 그대로인것에 대해 질문이 있는데요. new키워드를 통해 객체 생성시에는 name만 받기때문에 sodldier객체 각각에는 name만 있고, soldier1 = 40;을 했을 때 프로토타입 체인을 통해 hp를 검색해서 Lieionary 객체에서 hp를 찾은 후 40이라는 걸 대입했다고 생각하는데 그럼 soldier들이 공유하고있는 프로토타입 값에 대해 변해야되는거아닌가요? 그럼에도 불구하고 soldier2는 50이라는 것은 프로토타입체인을 통해 접근한 값에 새로운 값을 할당할 경우 프로토타입이 아니라 원본객체가 프로토타입의 변수 이름만 상속받아서 새로운 메모리를 만들어서 값을 할당받는것이라고 생각하는데 제가 생각한게 맞나요?
6년 전
값을 찾을 때는 프로토타입 체인을 거슬러올라가지만 값을 대입할 때는 거슬러올라가지 않습니다.