Table of Contents
Santa Inc.๋ ์ด๊ตญ์ ๋ธ๋ ๊ธฐ์ '์ฐํ ์ฃผ์ํ์ฌโ๋ฅผ ์ด์ํ๋ ๋ฐฉ์นํ ๊ฒ์(Idle game)์ด๋ค. ์ฐํ์ ๋ชฉ์ ์ ์ค์ง ์ ๋ฌผ ์์ฐ์ ์ต๋๋ก ๋์ด์ฌ๋ฆฌ๋ ๊ฒ. ์ฐํ๋ ์ง์์ ๊ณ ์ฉํ๊ณ , ์ ์ฑ ์ ์ฑํํ๋ฉฐ ๋์์ด ์ ๋ฌผ์ ์์ฐํ๋ค.
Santa Inc.๋ฅผ ์ฒ์ ๋ง๋ ๊ฑด 2015๋ ๊ฒจ์ธ์ด์๋ค. ์น ํ๋ก๊ทธ๋๋ฐ์ ๊ณต๋ถํ ํ ๋งค๋ ํฌ๋ฆฌ์ค๋ง์ค๋ง๋ค ์ด์ํ ๊ฑธ ๋ง๋ค์๋๋ฐ, ์ด๊ฒ๋ ๊ทธ ์ผํ์ด์๋ค. ๋น์์ ํฌ๋ฆฌ์ค๋ง์ค์ ๋ง์ถฐ ๋ฐ์นญํ๊ฒ ๋ค๋ ์์ฌ์ผ๋ก ํ๊ธฐ ์ค 20์ผ๋ง์ ๊ฒ์์ ์์ฑํ๋ค. ๋ฌผ๋ก ์ฝ๋๊ฐ ์๋ง์ง์ฐฝ์ด์๋ค.
๊ทธ๋ฆฌ๊ณ 2018๋ , ์๋ง์ด๋ ์ฝ๋๋ฅผ ES6 ํด๋์ค ๋ฌธ๋ฒ๊ณผ ํ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ด์ฉํด (์๋ง๋) ๊น๋ํ๊ฒ ์ ๋ฆฌํ๋ค.
๐ ์ฐํ๊ฐ ๋์ด ๋ฃจ๋ํ์ ์์ ์ ์ฐฉ์ทจํด๋ณด์ธ์!
์ฒ์ ์์ด๋์ด๋ '์ฐํ๊ฐ ์์ ์ ๊ณ ์ฉํด ํ์ฌ๋ฅผ ์ด์ํ๋ ๊ฒ์โ์ด์๋ค. ์ด๋ ธ์ ๋ ์ค๊ธฐ์ฐจ๊ฒ ํ ๋กค๋ฌ์ฝ์คํฐ ํ์ด์ฟค์ด๋ ๋ก์ฝ๋ชจ์ ๊ธ์ ์๋ฎฌ๋ ์ด์ ๊ฒ์โฆ์ด ์ด์์ ์ด๊ธด ํ์ง๋ง ๋น์ฅ ๋ง๋๋ ๊ฑด ๋ฌด๋ฆฌ์๋ค. ๋์ Cookie Clicker๋ผ๋ ๊ฒ์์ ์ฌ๋ฐ๊ฒ ํ ๊ธฐ์ต์ด ๋ฌ๊ณ , ์ด๊ฒ์ฒ๋ผ ๋ง๋ค์ด๋ด์ผ๊ฒ ๋ค๊ณ ๊ฒฐ์ฌํ๋ค.
ํฌ๋ฆฌ์ค๋ง์ค๊น์ง ์๊ฐ์ด ๋ง์ง ์์๊ธฐ ๋๋ฌธ์ ๊ธฐํ, ๋์์ธ, ๊ฐ๋ฐ์ ๋ชจ๋ ๋์์ ํ๋ค. (๊ทธ๋ฌ์ง ๋ง์์ด์ผ ํ๋ค! ๊ฐ๋ฐํ๋ค๊ฐ ๊ฐ์๊ธฐ ์๊ฐ์ด ๋ฐ๋์ด ์ฝ๋๋ฅผ ์์ ํ ์๋ก ์ง๊ฑฐ๋ ์๋ก์ด ๊ทธ๋ฆผ์ ๊ทธ๋ ค์ผ ํ๋ ์ํฉ์ด ์ฌ๋ฌ๋ฒ ๋ฐ์ํ๋ค.) ํ๋ก์ ํธ ์ค๊ฐ์ ์น๊ตฌ๊ฐ ๊ฒ์ OST๊น์ง ์๊ณกํด์คฌ๋๋ฐ, ๊ฒ์ ๋ถ์๊ธฐ์ ๋๋๋๋ก ์ ๋ง์ ๋จ์ด์ ธ์ ์ ์ ํ ์์๋ ๊ฒ ๊ฐ๋ค.
ํ์ฅ ๋ถ๊ฐ๋ฅํ ์์ดํ ์ฝ๋
ํ๋ ์ด์ด๋ ๋ฃจ๋ํ๋ ์์ ์ ๊ณ ์ฉํด์ ์ ๋ฌผ์ ์์ฐํ๋๋ก ํ ์ ์๋ค. ๊ฒ์ ํน์ฑ์ '๊ตฌ์ ํ ์ ์๋ ์์ดํ โ๊ณผ '์์ง ๊ตฌ์ ํ ์ ์๋ ์์ดํ โ์ด ๋๋์ด ์๊ณ , ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด ์์ดํ ์ ์ ๊ธ์ด ํ๋ฆฌ๋ ๋งค์ปค๋์ฆ์ด ํ์ํ๋ค. ๋ฐ๋ผ์ ์์ดํ ๋ฆฌ์คํธ๋ฅผ ๋จผ์ ๋ง๋ค์๋ค.
var htItem = [{
k_name : "๋ฃจ๋ํ",
name : "dolf",
img : "img/dolf.gif",
num : 0,
prod : 2,
addi : 1,
cost : 30,
lv : false
}, {
k_name : "์ธํด ์์ ",
name : "elf",
img : "img/elf.gif",
num : 0,
prod : 5,
addi : 2,
cost : 200,
lv : false
}, {
// ...
์ด๋๋ ์ ์ง ๋ชฐ๋ผ๋ ๋ฐฐ์ด์ ๊ฐ์ฒด๋ด๋ ๊ฑธ ๊ทธ๋ ๊ฒ ์ข์ํ๋ค. ์ฝ๊ฒ ํ์
ํ๊ธฐ ํ๋ ํ๋กํผํฐ๋ ๋์งธ์น๊ณ , ๊ฐ์ฅ ํฐ ๋ฌธ์ ๋ ์์ดํ
์ ์ค์ง ์ธ๋ฑ์ค๋ก ๊ด๋ฆฌํ๋ค๋ ์ ์ด๋ค. ํ๋ ์ด์ด๊ฐ ๊ฐ์ง ์ ๋ฌผ์ ๋ฐ๋ผ n๋ฒ์งธ ์์ดํ
์ ๊ตฌ์
ํ ์ ์๋๋ก ์ด๊ณ , ์์ดํ
๋ฆฌ์คํธ์์ n๋ฒ์งธ ์์๋ฅผ ํด๋ฆญํ๋ฉด htItem[n]
์์ดํ
์ด ๊ตฌ์
๋๋ ๋ฐฉ์์ด์๋ค.
์ด๋ค ์์ดํ
์ด ๋ช ๋ฒ์งธ ์์์ธ์ง ๊ธฐ์ตํด์ผ ํ๊ณ , htItem
์ค๊ฐ์ ์๋ก์ด ์์ดํ
์ ๋ผ์ ๋ฃ์ ์ ์์๋ค. ์ด ๋๋ฌธ์ '๋ฃจ๋ํโ์ โ์ธํด ์์ โ ์ฌ์ด์ ๋ค์ด๊ฐ '์๋ฐ์์ โ์ ๊ทธ๋ํฝ ์์
์ ๋ง์ณค์์๋ ๋๋ด ์ถ๊ฐํ์ง ๋ชปํ๋ค.
์คํ๊ฒํฐ ์ฃผ๋ ๊ฐ๋ฐ
์์ดํ ๊ด๋ จ ์ฝ๋๋ ์ฌ๊ฐํ์ง๋ง, ์ ์ฑ ๋ถ๋ถ์ ๋ ์ฌ๊ฐํ๋ค. ํ๋ ์ด์ด๊ฐ ์ ์ฑ ๋ฆฌ์คํธ์์ ์ ์ฑ ์ ๊ตฌ์ ํ๋ฉด ๊ทธ ์ ์ฑ ์ด ๊ฐ์ง ํจ๊ณผ๋ฅผ ์คํํด์ผ ํ๋๋ฐ, ๊ทธ ๋ถ๋ถ์ ์ด๋ ๊ฒ ์ฒ๋ฆฌํ๋ค:
// ์ ์ฑ
์ ํ์ ๋ฐ๋ฅธ ๋ถ๊ธฐ๋ฅผ ์ค์ , ์ฒ๋ฆฌํ๋ค.
function updatePolicy(sPolicy) {
if(sPolicy == "practice") { // ๋ฆฌ๋ณธ๋ฌถ๊ธฐ
nClickPres = 1.2;
renderPolicyList(1);
} else if(sPolicy == "smart-work") { // ์ค๋งํธ ์
๋ฌด ํ๊ฒฝ
nClickPres = 1.5;
renderPolicyList(2);
} else if(sPolicy == "night") { // ์ผ๊ทผ๋ฌธํ
htItem[0]["prod"] += 1;
$("#dolf .pr").text(htItem[0]["addi"] + " ~ " + htItem[0]["prod"] + "๊ฐ ์์ฐ");
renderPolicyList(3); // ์ด์ ํ์ด ์คํ
renderPolicyList(4); // ๋ฉํฐํ์คํน ์คํ
} else if(sPolicy == "pashion") { // ์ด์ ํ์ด
// ...
์ง์ฅ์ด ์๋ค๋ฉด ์ด๋ฐ ๋ชจ์ต์ผ๊น? ์ ์ฑ
๋ฆฌ์คํธ๋ ์์ดํ
์ฒ๋ผ ๊ฐ์ฒด ๋ฐฐ์ด๋ก ๊ตฌ์ฑํ์ง๋ง, ์ ์ฑ
๋ง๋ค ์คํํ ์ฝ๋๊ฐ ๋ค๋ฅด๋ค๋ ์ ๊ณผ ํ ์ ์ฑ
์ด ๋ค์ ์ ์ฑ
์ ์ฌ๋ฌ ๊ฐ ์ด ์ ์๋ค๋ ์ ์ด ์์ดํ
๊ณผ๋ ๋ฌ๋๋ค. ๊ฐ๋ น โ๋ฆฌ๋ณธ๋ฌถ๊ธฐโ ์ ์ฑ
์ ๊ตฌ์
ํ๋ฉด ์ ๋ฌผ ์์๋ฅผ ํด๋ฆญํ ๋ ๋ค์ด์ค๋ ์ ๋ฌผ์ด 1.2๊ฐ๊ฐ ๋๊ณ , ๋ค์ ์ ์ฑ
์ธ '์ค๋งํธ ์
๋ฌด ํ๊ฒฝโ์ด ์ด๋ฆฐ๋ค. ๋ฐ๋ฉด '์ผ๊ทผ๋ฌธํโ๋ฅผ ๊ตฌ์
ํ๋ฉด ๋ฃจ๋ํ(htItem[0]
์ด ๋ฃจ๋ํ๋ฅผ ์๋ฏธํ๋ ๊ฒ ํฌ์ธํธ.)์ ์ต๋ ์์ฐ๋์ด 1์ค๋ฅด๊ณ , '์ด์ ํ์ดโ์ '๋ฉํฐํ์คํนโ์ด ์ด๋ฆฐ๋ค.
์ค๊ฐ์ ์๋ก์ด ์ ์ฑ ์ ๋ผ์ ๋ฃ์ ์ ์์ ๋ฟ๋ง ์๋๋ผ, ์ ์ฑ ์ด ์ด๋ฆฌ๋ ์์์ ๊ฐ ์ ์ฑ ์ ์ธ๋ฑ์ค, ํจ๊ณผ, ์ด๋ฆ์ ๋ชจ๋ ์์งํด์ผ ํ๋ค. ์์งํ ์ด ๋ถ๋ถ์์ ๋๋ ค์น ๊น ๊ณ ๋ฏผํ๋ค.
๊ทธ๋ฆฌ๊ณ โฆ
ํฌ๋ฆฌ์ค๋ง์ค ์ง์ , ์น๊ตฌ๋ค์๊ฒ ๋ฌด์์๋ก ๋งํฌ๋ฅผ ๋ฟ๋ ค ๋ฒ ํํ ์คํธ๋ฅผ ํ๋ค. ์์ดํ ์ด๋ ์ ์ฑ ์ถ๊ฐ๋ ๋ถ๊ฐ๋ฅํ๊ณ , ๋ฒ๊ทธ ์์ ๊ณผ ๋ฐธ๋ฐ์ฑ์ ์ ๊ฒฝ์ผ๋ค. ์ค๋ ๊ธฐ์ฌ ๊น๋ด์์ด๋ผ๋ ๋ฐฉ์นํ ๊ฒ์์ ์ฐธ๊ณ ํด ๋ฐธ๋ฐ์ค๋ฅผ ๋ง์ท์ง๋ง, ๋ง์ ํ ์คํธ๋ฅผ ํด๋ณด๋ ์๋ณผ ๊ณณ์ด ๋ง์๋ค.
์ด๋ฐ ์์ ์คํ๊ฒํฐ ์ฝ๋๋ค์ santa.js
์ ๋๋ ค ๋ฐ์๋ค. ์ด์ฐ์ ์น ๋ฐ์นญํ๊ธฐ ํ์ง๋ง ๋น์ฐํ ์ ์ง๋ณด์๊ฐ ๋ถ๊ฐ๋ฅ์ ๊ฐ๊น์ ๊ณ , ๊ฒ์ ํ๋ฐ๋ถ์ ๊ฒ์์ด ๋ฉ์ถฐ๋ฒ๋ฆฐ๋ค๋ ๋ฆฌํฌํธ๋ ๋ง์๋ค. ๋ฃจ๋ํ์ ์์ ์ ์ฐฉ์ทจํ๋ ค ํ์ผ๋ ๊ฒฐ๊ณผ์ ์ผ๋ก ๋ด๊ฐ ๋๋ฅผ ์ฐฉ์ทจํ ์ํฉ์ด ๋๋ค. ์ดํ๋ก ์
๋ฐ์ดํธ๋ ์ปค๋
์์คํ์ผ์ ๋ค์ ์ด์ด๋ณด๋ ์ผ๋ ์โฆ์ ์ค ์์์ผ๋โฆ
๐ ์ธ๊ณ๋ฅผ ์ ๋ํ๋ ๊ธ๋ก๋ฒ ๊ธฐ์ (์ฃผ)์ฐํ
2018๋ ์ด ๊น๋ฉ ํ๋ก์ ํธ ๋ช ๊ฐ๋ฅผ ๊นํ๋ธ๋ก ์ฎ๊ธฐ๋ ์์ ์ ํ๋ค. ์ด๋ Santa Inc. ์ฝ๋๋ฅผ ๋ค์ ์ด์ด๋ดค๋๋ฐ, ์ ๋ง '๋ด ์ธ์์ ์ด๋ด ์ฝ๋๋ฅผ ๋จ๊ฒจ๋๋ ๊ฑด ๋ถ๋๋ฌ์ด ์ผ์ด๋คโ๋ผ๋ ์๊ฐ์ด ๋ค์ด ๋ฐ๋ก ๋ฏ์ด ๊ณ ์น๊ธฐ ์์ํ๋ค. ์ด๋๊ฐ 1์์ด์์ผ๋ ํฌ๋ฆฌ์ค๋ง์ค๊น์ง ์๊ฐ์ ์ถฉ๋ถํ๋ค.
๋ชจ๋ ๊ฒ์ ๋ชจ๋ํํ์
๊ฒ์์ ๋ฑ์ฅํ๋ ์ฃผ์ ์์๋ ํฌ๊ฒ ๋ ๊ฐ์ง, ์ง์๊ณผ ์ ์ฑ
์ด๋ค. ๋จผ์ Worker
ํด๋์ค๋ฅผ ์ถ์ ํด๋์ค๋ก ํ์ฉํ๋ฉด์ ์ด๋ฅผ Rudolph
๋ InternElf
์ ๊ฐ์ ๊ฐ๊ฐ์ ์ง์ ํด๋์ค์ ์์ํ๋ค. ES6 ๋๋ถ์ ํด๋์ค ๋ฌธ๋ฒ์ ๋ฐ๋ผ ๊ฐ๋ฐํ ์ ์์๋ค.
class Worker {
static cost = 0;
static minOutput = 0;
static maxOutput = 0;
constructor() {
this.output = 0;
this.level = 1;
// ...
this.img = '';
}
static getMinOutput() {
return this.minOutput;
}
static getMaxOutput() {
return this.maxOutput;
}
// ...
next() {
throw new Error('next() must be implemented.');
}
}
export default Worker;
์ฝ๋๊ฐ ๋๋ฌด ๊ธธ์ด ๋ง์ ๋ถ๋ถ์ด ์๋ต๋์์ง๋ง, ๋๋ต ์ด๋ฐ ๋ชจ์ต์ด๋ค. ๋ค๋ฅธ OOP ์ธ์ด์ ๋น์ทํ๊ฒ ํด๋์ค ๋ฌธ๋ฒ์ ์ฌ์ฉํ ์ ์๋ค. ๋ค๋ง ์ถ์ ๋ฉ์๋๋ผ๋ ๊ฐ๋
์ด ์์ด์ next
๋ฉ์๋๋ ์๋ธํด๋์ค์์ ๊ตฌํ๋์ด์ผ ํ๋ค๋ ์๋ฌ๋ฅผ ๋์ง๋๋ก ํ๋ค.
๊ทธ๋ฆฌ๊ณ ๊ฐ ์ง์ ํด๋์ค๋ค์ด Worker
๋ฅผ ์์๋ฐ๋๋ค.
class Rudolph extends Worker {
static cost = 1;
static minOutput = 1;
static maxOutput = 2;
constructor() {
super();
this.name = 'rudolph';
this.korName = '๋ฃจ๋ํ';
this.img = '/assets/rudolph.gif';
}
next() {
return new ParttimeElf();
}
}
export default Rudolph;
Rudolph
์ธ์คํด์ค๋ฅผ ํตํด next
๋ฅผ ํธ์ถํ๋ฉด ๋ค์ ๋จ๊ณ ์ง์์ธ ์๋ฐ์์ (ParttimeElf
)์ ๋ฐํ๋ฐ๋๋ค. ์ด๋ ๊ฒ ๋ชจ๋ ์ข
๋ฅ์ ์ง์์ ๊ฐ๊ฐ์ ํด๋์ค๋ก ๋๋ ์ ๊ด๋ฆฌํ๋ ํจ์ฌ ํธํ๊ฒ ๊ฐ๋ฐํ ์ ์์๋ค. ์ ์ฑ
๋ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๊ตฌํํ๋ค.
โ๊ฐ๋ ๊ด ๋ฐฐ์นโ ์ ์ฑ ์ ๋ชจ๋ ์ง์์ ์์ฐ๋์ 1๋๋ ค์ค๋ค. ์ด ๋์๋ ๋ค๋ฅธ ๋ชจ๋์ ์ ํ ๊ฑด๋๋ฆฌ์ง ์๊ณ ๊ฐ๋ ๊ด ๋ฐฐ์น ํด๋์ค์์ ์์ฃผ ๊ฐ๋จํ๊ฒ ๊ตฌํํ ์ ์๋ค.
class Supervisor extends Policy {
// ...
static execute() {
const workers = Game.getHiredWorkers();
workers.forEach((worker) => {
worker.setOutput(worker.getOutput() + 1);
PersonnelInterface.updateOutput(worker.getName(), worker.getOutput());
Game.addTotalOutput(1);
});
}
}
Supervisor.execute()
์ ๊ฐ์ด ํธ์ถ๋๋ฉด ๊ณ ์ฉ๋ ์ง์ ๊ฐ์ฒด๋ก ๊ตฌ์ฑ๋ ๋ฐฐ์ด์ ๊ฐ์ ธ์ ๊ฐ ์ง์์ setOutput
๋ฉ์๋๋ฅผ ํธ์ถํด ์์ฐ๋์ 1์ฉ ์ฆ๊ฐ์ํจ๋ค. ๊ทธ๋ฆฌ๊ณ ์คํฌ๋ฆฐ์ ์ฌ์ด๋๋ฐ์ ์๋ '์ธ์ฌ ํญโ์ ์
๋ฐ์ดํธํ๊ธฐ ์ํด PersonnelInterface
์ updateOutput
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.
์ด๋ก์จ ์ง์๊ณผ ์ ์ฑ , ์ธํฐํ์ด์ค๊ฐ ์์ ํ ๋ ๋ฆฝ์ ์ผ๋ก ๋์ํ๋ฉฐ public ๋ฉ์๋๋ฅผ ํตํด ์ต์ํ์ ๊ด๊ณ๋ฅผ ์ ์งํ ์ ์๊ฒ ๋์๋ค. (์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ชจ๋ ํ๋กํผํฐ๊ฐ publicํ์ง๋งโฆ) ์์ ๋ฐฉ์๋๋ก๋ผ๋ฉด if๋ฌธ ์ง์ฅ์์์ ์ด์ค๋ฃจํ๋ฅผ ๋๋ฆฌ๋ ์ง์ ํ์์ง๋ ๋ชจ๋ฅธ๋ค.
ํ์ ์คํฌ๋ฆฝํธ๋ก ๋ง์ด๊ทธ๋ ์ด์
์๋ฌด๋ฆฌ ES6๋ผ๋ ์๋ฐ ํ๋ก๊ทธ๋๋ฐ์์์ ๊ฐ๋ฐ ๊ฒฝํ์ ๋นํ๋ฉด ๋ถํธํ ์ ์ด ๋ง์๋ค. abstract๋ interface๊ฐ์ OOP ๋ฌธ๋ฒ์ด ์๋ค๋ ๊ฑด ๋์งธ์น๊ณ , ๋ค์ํ ํด๋์ค๋ฅผ ๋ค๋ฃจ๋ค๋ณด๋ ์์ ํ์ ๋ง ์๊ฐํ ์๊ฐ ์๋ค๋ ๊ฒ ํฐ ๋ฌธ์ ์๋ค. Worker ํ์ , Policy ํ์ ๋ฑ์ด ๋ง๊ตฌ ์์ด๊ธฐ ์์ํ๋ค. ์ฌ๊ธฐ์ ๋ํด ์ธ์คํด์ค ๋ฉค๋ฒ์ ์๋ ์์ฑ์ด ์ ๋๋ก ์ ๋๋ค๋ ๋ถํธํจ๋ ์์๋ค.
ํ์ ๋ฌธ์ , ์ญ์ ํ์ ์คํฌ๋ฆฝํธ๊ฐ ๋ฐ๋ก ๋ ์ฌ๋๋ค. ๊ธฐ์กด ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ํ์ ์คํฌ๋ฆฝํธ๋ก ๊ทธ๋๋ก ์ฎ๊ธฐ๋ ์์ ์ด ํฌ๊ฒ ์ด๋ ค์ธ ๊ฒ ๊ฐ์ง๋ ์์๋ค. ๋ฐ๋ก ์๋ก์ด ๋ธ๋์น๋ฅผ ๋ง๋ค์ด ํ์ ์คํฌ๋ฆฝํธ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ์์ ์ ์์ํ๋ค.
abstract class Worker {
protected static cost: number = 0;
protected static minOutput: number = 0;
protected static maxOutput: number = 0;
protected output: number;
protected level: number;
protected levelCost: number;
// ...
protected img: string;
constructor() {
this.output = 0;
this.level = 1;
this.levelCost = 0;
// ...
this.img = '';
}
static getMinOutput(): number {
return this.minOutput;
}
static getMaxOutput(): number {
return this.maxOutput;
}
// ...
abstract next(): Worker;
}
export default Worker;
๊ธฐ์กด ์ฝ๋์ ๊ฑฐ์ ๋น์ทํ๋ค! ํ์ ์คํฌ๋ฆฝํธ๋ public, private, protected์ ๊ฐ์ ์ ๊ทผ ์ ํ์๋ฅผ ์ ๊ณตํ๋ค. public์ ์ธ๋ถ์์ ํด๋น ํด๋์ค์ ๋ฉค๋ฒ์ ์ง์ ์ ๊ทผํ ์ ์๊ณ , private์ ํด๋น ํด๋์ค ๋ด๋ถ์์๋ง ์ ๊ทผํ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ protected๋ ํด๋น ํด๋์ค์ ๊ทธ ์๋ธํด๋์ค์์๋ง ์ ๊ทผ ํ ์ ์๋ค.
Worker
์ ํ๋กํผํฐ๋ค์ protected๋ก ์ค์ ํด Worker
์ ์๋ธํด๋์ค์์๋ง ํ๋กํผํฐ์ ์ง์ ์ ๊ทผํ ์ ์๋๋ก ์ ํํ๋ค. ์ด ํ๋กํผํฐ๋ค์ ์ค์ง getter, setter ๋ฉ์๋๋ฅผ ํตํด์๋ง ์ ๊ทผํ ์ ์๋ค.
์ถ์ ํด๋์ค์ ์ถ์ ๋ฉ์๋๋ ๋ง๋ค ์๋ ์๋ค. Worker
ํด๋์ค๋ฅผ ์ถ์ ํด๋์ค๋ก ๋ง๋ค์ด new Worker()
์ฒ๋ผ ์์ฑํ์ง ๋ชปํ๋๋ก ํ๋ค. ๋ํ ์์ ์ง์ ์๋ฌ๋ฅผ ๋์ ธ์ฃผ๋ next
๋ฉ์๋๋ ์ถ์ ๋ฉ์๋๋ก ๋ง๋ค์๋ค. ์ด์ ์๋ธํด๋์ค์์ next
๋ฅผ ์ค๋ฒ๋ผ์ด๋ํ์ง ์์ผ๋ฉด ํ์
์คํฌ๋ฆฝํธ ์ปดํ์ผ๋ฌ๊ฐ ์์์ ์ก์๋ธ๋ค.
๋์ฒด๋ก ์๋ฐ ๋ฌธ๋ฒ๊ณผ ๊ต์ฅํ ๋น์ทํ๋ค๋ ๋๋์ ๋ฐ์๋ค.
๐ ์ฝ๋ฉ๋ง๊ณ ๋ค๋ฅธ ์์ ๋ค
ํ๋ก๊ทธ๋๋ฐ๋ฟ ์๋๋ผ ๊ธฐํ๊ณผ ๊ทธ๋ํฝ๋ ์ค์ํ ์์ ์ด์๋ค.
๋ง์ฐ์ค๋ก ๋ํธ์ฐ๊ธฐ
๋ํธ๊ทธ๋ํฝ ์ธ์๋ ์ ํ์ง๊ฐ ์์๋ค. ๋คํ์ธ ๊ฒ์ ๋ด๊ฐ ๋ํธ๊ทธ๋ํฝ์ ์ข์ํ๊ณ , ๋ํธ๋ฅผ ์ฐ๋ ๊ฒ๋ ์ข์ํ๋ค๋ ๊ฒ์ด์๋ค. ๋ง์ฐ์ค๋ก ์ด์ฌํ ๋ํธ๋ฅผ ์ฐ์ด ํ๋ ์ ํฌํจ 30๊ฐ ์ ๋์ ์ด์ ์ ๋ง๋ค์๋ค. ์ด ์ค์๋ ์ธ๊ฒ์์ ์ ์ฉ๋ ๊ฒ๋ ์๊ณ , ์ํ๊น๊ฒ ์ ์ฉ๋์ง ๋ชปํ ๊ฒ๋ ์๋ค. ๋น ๊ต์ค์์ ๋์ค๋ ์ฐฝ๋ฐ์ ๋ณด๋ฉฐ ๋ํธ์ฐ๋(โฆ) ๊ทธ๋๊ฐ ์๊ฐ๋๋ค.
์ฌ๋ผ์ง ์ฝํ ์ธ ์ ์ถ๊ฐ๋ ์ฝํ ์ธ
์ฌ์ค Santa Inc.๋ 2015๋ ์ฌํ ์ด์๋ฅผ ํ์ํ๊ธฐ ์ํด ๋ง๋ค์๋ ๊ฒ์์ด์๋ค. ๋น์์๋ ํ์ฐฝ ์ด์ ํ์ด๋ ๋ ธ๋๊ฐํ์ ๋ํ ๋ ผ์๊ฐ ํ๋ฐํ๊ณ , Molleindustria์ฒ๋ผ ์ฌํ์ ๋ฉ์์ง๋ฅผ ๋ด์ ๊ฒฐ๊ณผ๋ฌผ์ ๋ง๋ค๊ณ ์ถ์๋ค. ๊ทธ๋์ ์ฒซ ๋ฒ์ ์๋ ํ๋ ์ด์ด๊ฐ ์ ๋ ์ ์ฑ ์ ๋ค์ ์ฑํํ๋ ํ๋ฐ๋ถ์ ์์ ๋ค์ด ๋ ธ์กฐ๋ฅผ ๊ฒฐ์ฑํด ํ์ ์ ๋์ ํ๊ณ , ํ์ฌ๊ฐ ๊ฐ์, ์์ก ์ ์ฐจ๋ฅผ ๊ฑฐ์น๋ฉฐ ๋ ธ์กฐ๋ฅผ ํ๊ดดํ๋ ์๋๋ฆฌ์ค๊น์ง ์์๋ค.
๊ฒ์์ ๋ค์ ๋ง๋ 2018๋ ์ ๋๊ฐ์ ์์๋ฅผ ๋ฃ๊ธฐ์ ์์์ ๋ง์ง ์์๋ค. ๋ ธ๋ ์ด์๋ฅผ ๊ทธ๋๋ก ๋ค๋ฃจ๋, ๋ช๊ฐ์ง ์ ์ฑ ์ ๋นผ๊ณ ์ด๋ฅผ ๋์ฒดํ๋ ๋ค๋ฅธ ์ ์ฑ ๋ค์ ์ถ๊ฐํ๋ค. ๊ธฐ์กด์ ํด๊ณ ํญ๋ ์ธ์ฌ ํญ์ผ๋ก ๋ฐ๊ฟ ์ง์์ ์น์ง์ํค๋ ๊ธฐ๋ฅ์ ๋ํ๋ค.
๊ธฐ์กด์ ์ง์์ผ๋ก ์๋ '์ปคํโ๋ ๋บ๋ค. ์์ ์๋ ํฌ๋ฆฌ์ค๋ง์ค๋ง๋ค ์ปคํ์ ๋ฐ์ผ๋ก ์ฌ์ฉํ๋ ํ๊ตญ ์ ํต(?)์ ๋ฐ๋ผ ์ปคํ์ ์ง์์ผ๋ก ๋ฃ์์ผ๋, ์ง๊ธ ๋ณด๋ ๋ณ๋ก ์ ์ ํ์ง ์์๋ค. ์บ๋ฆญํฐ์ ์ ๋ ๊ณ ์ ๊ด๋ ์ด ๊ทธ๋๋ก ๋ฐ์๋๊ธฐ๋ ํ๊ณ , ์ต๊ทผ์๋ ๊ทธ๋ฐ ๋ฐ์ด ๊ฑฐ์ ์ฌ๋ผ์ง ๊ฒ ๊ฐ๋ค. ๋์ ๊ทธ ์๋ฆฌ์ 'ํธ๋ฆฌโ๋ฅผ ์ถ๊ฐํ๋ค. ํฌ๋ฆฌ์ค๋ง์คํ๋ฉด ํธ๋ฆฌ์ธ๋ฐ ์ ์ง์์ ์ ๋ฃ์๋์ง ๋ชจ๋ฅด๊ฒ ๋ค.
'์์ด๋คโ๋ ๋นผ๋ ค ํ๋ค. ์์ด๋ค์ ์ํด ์ ๋ฌผ์ ์ฃผ๋ ์ฐํ๊ฐ ์๋๋ ธ๋์ ์ํํ๋ ๋ชจ์ต์ ํตํด ๋ธ๋๊ธฐ์ ์ฐํ ์ฃผ์ํ์ฌ์ ์ ์ฒด์ฑ์ ์ข ๋ ๋ช ํํ ํ๋ ค๋ ์๋์๋๋ฐ, ๋ง์์ด ์ํ์ ์์ด๋ค์ ๊ณ ์ฉํ์ง ์์๋ค๋ ๋ง์ ๋ฃ๊ณ ์ด๋ฒ์๋ ์์ ๋ ค ํโฆ์ผ๋ ๋ชจ ํ์ฌ์์ ์ฌ์ผ ์ ๋ฌด์ ๋ถ๋ฒ์ ์ผ๋ก ์ฒญ์๋ ๋ ธ๋์๋ฅผ ๋์ํ๋ค๋ ๋ด์ค๊ฐ ๋์ ๋ค์ ๋ฃ๊ฒ ๋์๋ค.
์ถ๊ฐ๋ก, ์์ ์ ์ถ๊ฐํ์ง ๋ชปํ๋ ๋น์ด์ ์๋ฐ์์ ์ ๋ฃจ๋ํ์ ์ธํด์์ ์ฌ์ด์ ๋ฃ์๋ค.
๐ค ๊ทธ๋ฐ ์ง์ ํ์ง ๋ง์์ผ ํ๋๋ฐ
์ ์ด์ฟผ๋ฆฌ๋ฅผ ๋ฒ๋ฆฌ๊ณ ์ถ์์ง๋ง ์ฒ์ ๋ง๋ค ๋ ์ ์ด์ฟผ๋ฆฌ๋ก ๋ง๋ค์๋๋ ๋ค๋ฐ๊พธ๋ ๊ฒ ์ฝ์ง ์์๋ค. ์์ ์น ๊ฒ์ ์์ง์ ์ฐ๋ฉด ์ข์๋ฐ, ๋ก์ง์ ๊ณ ์น๋ ๊ฒ๋ง์ผ๋ก๋ ๋ฒ ์ฐจ์ ์ด ๋ถ๋ถ์ ์ ์ ๊ฒฝ์ฐ์ง ๋ชปํ๋ค.
์ผ๋จ ๋ก์ง๊ณผ html ์ฝ๋ ์กฐ๊ฐ์ด ๋ง๊ตฌ ์์ฌ์๋ ๊ฒ ์ ๊ฒฝ์ฐ์๋ค. ๋ฆฌ์กํธ์์ ์ปดํฌ๋ํธ๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒ์ฒ๋ผ ์์๋ณ๋ก ๋ชจ๋์ ๋ถ๋ฆฌํ๋ฉด ์ด๋จ๊น ์ถ์ด์ ์๋ํด๋ดค๋ค.
const WorkerItem = (
name: string,
img: string,
korName: string,
cost: number,
minOutput: number,
maxOutput: number
) => {
return (
`<li id="${name}">` +
`<img class="worker-img" src="${img}"/>` +
`<p>${korName}` +
'<img class="item-present-img" src="./assets/present.png">' +
`<span class="t">${cost}</span>` +
`<br/><span class="pr">${minOutput} ~ ${maxOutput}๊ฐ ์์ฐ</span>` +
'</p>' +
'</li>'
);
};
export default WorkerItem;
์ง์ ๋ชฉ๋ก์ ๊ฐ ์์ดํ ์ ์ปดํฌ๋ํธ๋ก ๋ง๋ค์๋ค. ์ด์ ํ์ํ ๊ณณ์์ ๋ถ๋ฌ์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
import WorkerItem from './WorkerItem';
// ...
drawWorkerList(worker: Worker): void {
// ...
this.elements.workerList.append(
WorkerItem(
worker.getName(),
worker.getImg(),
worker.getKorName(),
workerClass.getCost(),
workerClass.getMinOutput(),
workerClass.getMaxOutput()
)
);
// ...
ํ๋ผ๋ฏธํฐ๋ ๋ง๊ณ ๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ๋ ์๋ฒฝํ์ง ์์์ ์ฌ์ ํ ๋ง์์ ์ ๋ค์ง๋ง, ๊ทธ๋๋ ๋ก์ง๊ณผ ๋ค์์ฌ ์๋ ๊ฒ๋ณด๋ค๋ ์กฐ๊ธ ๋์์ก๋ค. ๋ถ๋ช ์ ์ด์ฟผ๋ฆฌ ์ฅ์ธ๋ค์ ๋ ๋์ ๋ฐฉ๋ฒ์ ์ผ์ ๊ฒ ๊ฐ์๋ฐ ์ ๋ชจ๋ฅด๊ฒ ๋ค.
ํ์ ๊ฒ์ ๊ฐ๋ฐ์ชฝ์ ํฐ ๊ด์ฌ์ด ์์์๋ ์ฃผ๊ธฐ์ ์ผ๋ก ๊ฒ์์ ๋ง๋ค์ด์ง๊ณ ์ถ์ด์ง๋ ์๊ธฐ๊ฐ ์จ๋ค. ๋ค์์๋ ์์ (์์ ์ ํ๋ค๊ฐ ๊ด๋) ์ ๋ํฐ๋ฅผ ๊ณต๋ถํด์ ๋ง๋ค์ด๋ณผ๊นํ๋ค.
Santa Inc.์ ์ฝ๋๋ GitHub ์ ์ฅ์์์ ์ดํด๋ณผ ์ ์๋ค.