안녕하세요. 이번 시간에는 플라이급 패턴에 대해서 알아보겠습니다. 패턴이 참 많죠? 아직 반도 안 왔습니다. 패턴이야 만들기 나름이니까요. 플라이급 패턴은 꼭 알아둬야 하는 패턴입니다. 이름은 생소하지만 복합체 패턴처럼 모두가 써 본 패턴입니다. 이번에도 안 써봤다고요? ...
생성자 객체를 하나 만들어보죠. 객체는 병사입니다. 이전 시간에 군단과 그 하부 조직을 만들었다면, 이번 시간은 병사 개개인을 만들겠습니다. 로마에는 군단이 수십 개가 있고 각 군단에 최소 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를 관리할 수 있습니다. 메모리는 아끼면서 특성도 관리할 수 있는 거죠. 이것을 플라이급 패턴이라고 부릅니다.
다음 시간에는 퍼사드 패턴에 대해 알아보겠습니다.