Bibi's DevLog ๐Ÿค“๐ŸŽ

[์ธํ”„๋Ÿฐ]Javascript์ž…๋ฌธ - ๊ฐ์ฒด์™€ ํ”„๋กœํ† ํƒ€์ž… (ํ”„๋กœํ† ํƒ€์ž…, ๋ฐฐ์—ด/๊ฐ์ฒด/์ฐธ์กฐ๋ณ€์ˆ˜) ๋ณธ๋ฌธ

ํ”„๋กœ๊ทธ๋ž˜๋ฐ/Javascript ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ

[์ธํ”„๋Ÿฐ]Javascript์ž…๋ฌธ - ๊ฐ์ฒด์™€ ํ”„๋กœํ† ํƒ€์ž… (ํ”„๋กœํ† ํƒ€์ž…, ๋ฐฐ์—ด/๊ฐ์ฒด/์ฐธ์กฐ๋ณ€์ˆ˜)

๋น„๋น„ bibi 2020. 10. 21. 23:54
* ์ด ๊ธ€์€ ์ธํ”„๋Ÿฐ์—์„œ ์ œ๊ณตํ•˜๋Š” ํ˜ธ๋ˆ…์Šค๋‹˜์˜ ์œ ๋ฃŒ ๊ฐ•์˜ '์‰ฝ๊ณ  ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ฐฐ์›Œ๋ณด๋Š” Javascript ์ž…๋ฌธ - ์ฝ”๋“œ์Šค์ฟผ๋“œ ๋งˆ์Šคํ„ฐ์ฆˆ ์ฝ”์Šค ๋ ˆ๋ฒจ1'๋ฅผ ๋“ฃ๊ณ  ๊ณต๋ถ€ํ•˜๋ฉฐ ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค. ๊ฐ•์˜ ๋‚ด์šฉ์— ๋”ํ•ด ์ œ๊ฐ€ ํ•„๊ธฐํ•˜๊ณ  ๊ตฌ๊ธ€๋งํ•œ ๋‚ด์šฉ์ด ์ •๋ฆฌ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ดˆ๋ณด์ธ ์ œ๊ฐ€ ์ดํ•ดํ•œ ๋Œ€๋กœ ์ •๋ฆฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋ถ€์ •ํ™•ํ•œ ๋‚ด์šฉ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Œ์„ ๊ฐ์•ˆํ•ด ์ฃผ์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ฐ•์˜์˜ ๋‹จ์ˆœ ๋ณต๋ถ™์ด ์•„๋‹Œ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•œ ๊ธ€์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ธํ”„๋Ÿฐ ์ธก ๋‹ต๋ณ€์„ ๋ฐ›์€ ์ ์ด ์žˆ์œผ๋‚˜(https://bibi6666667.tistory.com/37), ์ €์ž‘๊ถŒ์ƒ ๋ฌธ์ œ๊ฐ€ ๋œ๋‹ค๋ฉด ๋ณดํ˜ธ ๋ชจ๋“œ(๋น„๊ณต๊ฐœ)๋กœ ์ „ํ™˜ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

Prototype

๋‚œ์ด๋„๊ฐ€ ๊ฝค ์žˆ๋Š” ๊ฐ•์ขŒ์ด๋ฏ€๋กœ ๊ทธ๋ƒฅ ์•ˆ ๋ฐฐ์šฐ์‹œ๊ณ  ๋„˜์–ด๊ฐ€๋„ ๋ฌด๋ฐฉํ•ฉ๋‹ˆ๋‹ค.

 

ํ”„๋กœํ† ํƒ€์ž… prototype

์ƒ์„ฑ์ž๋กœ ๋งŒ๋“  ๊ฐ์ฒด๋Š” ํ”„๋กœํ† ํƒ€์ž…์ด๋ผ๋Š” ์†์„ฑ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.
ํ”„๋กœํ† ํƒ€์ž…์ด๋ž€? 'ํด๋ž˜์Šค ๊ฐ„์— ๊ณต์œ ํ•˜๋Š” ์†์„ฑ' ์ด๋ผ๊ณ  ์ผ๋‹จ์€ ์•Œ์•„๋‘๊ธฐ.
(๐Ÿ‘‰์ง€๊ธˆ์€ 'ํ”„๋กœํ† ํƒ€์ž…์ด๋ผ๋Š” ์†์„ฑ์ด ์žˆ๊ณ , ํด๋ž˜์Šค ๊ฐ„์— ํ”„๋กœํ† ํƒ€์ž…์ด๋ผ๋Š” ์†์„ฑ์„ ๊ณต์œ ํ•œ๋‹ค' ์ •๋„๋งŒ ์•Œ์•„๋‘๊ธฐ.)

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ”„๋กœํ† ํƒ€์ž…์„ ์ž˜ ์ดํ•ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. MDN ์ฐธ๊ณ  ๋งํฌ  
(but ์ดˆ๋ณด ๋ ˆ๋ฒจ์—์„œ ๋‹ค ์ดํ•ดํ•˜๋Š” ๊ฑด ๋ฌด๋ฆฌ์ด๋ฏ€๋กœ ๊ทธ๋ƒฅ ์ด๋Ÿฐ ๊ฒŒ ์žˆ๋‹ค ์ •๋„๋งŒ ์•Œ์•„๋‘์ž)

์ผ๋‹จ ์šฐ๋ฆฌ๋Š” ํ”„๋กœํ† ํƒ€์ž…์„ ์ด์šฉํ•ด์„œ ๋ฉ”์†Œ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋ ค ํ•ฉ๋‹ˆ๋‹ค.
์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ˆ์•ฝํ•˜๊ณ , ํšจ์œจ์ ์œผ๋กœ ๊ฐ์ฒด์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ง€๋‚œ ์˜ˆ์ œ๋“ค์ฒ˜๋Ÿผ, ์ƒ์„ฑ์žHuman ์•ˆ์— ๋ฉ”์†Œ๋“œattack๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์‚ฌ์‹ค ๊ต‰์žฅํžˆ ๋น„ํšจ์šธ์ ์ธ ์ผ์ด๋‹ค.
๊ฐ ์ธ๊ฐ„๋“ค์€ name, hp, mp, power์€ ๊ฐ๊ฐ ๋ชจ๋‘ ๋‹ค๋ฅด๊ฒŒ ๊ฐ€์งˆ ๊ฒƒ์ด๋‚˜,
attack์ด๋ผ๋Š” ๋ฉ”์†Œ๋“œ๋Š” ๋ชจ๋“  ์ธ๊ฐ„๋“ค์—๊ฒŒ ๊ณตํ†ต์ ์œผ๋กœ ์ ์šฉ๋  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ.
๊ทธ๋Ÿฌ๋‚˜ ์ƒ์„ฑ์ž ๋‚ด์— ๋ฉ”์†Œ๋“œ๋ฅผ ๋„ฃ์–ด๋ฒ„๋ฆฌ๋ฉด, ๊ฐ ์ธ๊ฐ„๋“ค๋งˆ๋‹ค ๋ฉ”์†Œ๋“œ๋ฅผ ๋”ฐ๋กœ๋”ฐ๋กœ ๊ฐ€์ง€๊ฒŒ ๋˜์–ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋‚ญ๋น„ํ•˜๊ณ  ๋น„ํšจ์œจ์ ์œผ๋กœ ๋ฉ”์†Œ๋“œ๊ฐ€ ๋งŒ๋“ค์–ด์ง€๊ฒŒ ๋œ๋‹ค.
์ด ๋•Œ, ์ธ๊ฐ„์ด๋ผ๋Š” "ํด๋ž˜์Šคclass"๋“ค์ด ๊ณตํ†ต์œผ๋กœ ๊ฐ€์ง€๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ "ํ”„๋กœํ† ํƒ€์ž…prototype"์œผ๋กœ ๋ฌถ์–ด์„œ ํ•œ ๋ฒˆ์˜ ์ฝ”๋“œ๋กœ ์ ์šฉํ•ด ์ค„ ์ˆ˜ ์žˆ๋‹ค.

 

// ํ”„๋กœํ† ํƒ€์ž… ์—†์ด ์ƒ์„ฑ์ž ๋‚ด์— ๋ฉ”์†Œ๋“œ๋ฅผ ๋„ฃ์œผ๋ฉด..
function Human(name, hp, attack) {
    this.name = name; 
    this.hp = hp;
    this.power = attack;
    this.attack = function(target) {
        target.hp -= this.power; 
    };
}
// Human์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์ƒˆ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ๋•Œ๋งˆ๋‹ค ๋ฉ”์†Œ๋“œ๊ฐ€ ๋”ฐ๋กœ๋”ฐ๋กœ ์ƒ์„ฑ๋˜์–ด, ๋น„ํšจ์œจ์ ์ด๊ณ  ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋‚ญ๋น„๋จ.

// ํ”„๋กœํ† ํƒ€์ž…์„ ํ™œ์šฉํ•ด ์ƒ์„ฑ์ž์™€ ๋ฉ”์†Œ๋“œ๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ค๋ฉด..
function Human(name, hp, attack) {
    this.name = name; 
    this.hp = hp;
    this.power = attack;
}
var p1 = new Human('honux', 10);
p1; // Human {name: "honux", hp: 100, pow: 10}
p1.attack(p1) // ์—๋Ÿฌ ๋ฐœ์ƒ. ์•„์ง .attack()๋ฉ”์„œ๋“œ๊ฐ€ ๋งŒ๋“ค์–ด์ง€์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ!

//ํ”„๋กœํ† ํƒ€์ž…์œผ๋กœ .attack()๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ ๋‹ค.
Human.prototype.attack = function(target) {
	target.hp -= this.power; 
};
Human; 
/* f (name, attack) {
	this.name = name;
    this.hp = 100;
    this.pow = attack;
   } ์œผ๋กœ ์กฐํšŒ๋œ๋‹ค. */
Human.prototype; 
// {attack: f, constructor: f}์œผ๋กœ ์กฐํšŒ๋œ๋‹ค.
p1.attack(p1)
p1; // Human {name: "honux", hp: 90, pow: 10}
// ํ”„๋กœํ† ํƒ€์ž…์œผ๋กœ ๋ฉ”์†Œ๋“œ๋ฅผ ๋งŒ๋“ค๊ณ  ๋‚˜๋ฉด .attack()๋ฉ”์†Œ๋“œ๊ฐ€ ์ž˜ ์ž‘๋™ํ•จ.

 

 

๋ฐฐ์—ด๊ณผ ๊ฐ์ฒด

๊ฐ์ฒด์˜ ์†์„ฑ๊ฐ’์ด ๋ฐฐ์—ด์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 
(๊ฐ์ฒด ๋‚ด์˜ ์†์„ฑ์œผ๋กœ ๋ฐฐ์—ด์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค)

p1.item = ["sword", "shield", "potion"];
// ๊ฐ์ฒด p1์˜ ์†์„ฑ item์œผ๋กœ ["sword", "shield", "potion"]๋ผ๋Š” ๋ฐฐ์—ด์„ ๋„ฃ์—ˆ๋‹ค.
p1; // Human {name: "honux", hp: 90, pow: 10, item: ["sword", "shield", "potion"]}
p1.item; //  ["sword", "shield", "potion"]
p1.item[0] // "sword"
p1.item[1] // "shield"
p1.item[2] // "potion"
// ์ด๋ ‡๊ฒŒ ๊ฐ์ฒด์˜ ์†์„ฑ๊ฐ’์œผ๋กœ ๋ฐฐ์—ด์ด ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.

 

๋˜, ๋ฐฐ์—ด ์•ˆ์˜ ๊ฐ’๋“ค์ด ๊ฐ์ฒด๊ฐ€ ๋  ์ˆ˜  ์žˆ์Šต๋‹ˆ๋‹ค.
(๋ฐฐ์—ด์˜ ์›์†Œ๋กœ ๊ฐ์ฒด๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค)

// (์•ž ์ฝ”๋“œ์™€ ์ด์–ด์ง)
var arr = [p1, p2];
arr; // [p1, p2]
arr[0]; // Human {name: "honux", hp: 90, pow: 10, item: ["sowrd","shield","potion"]}
arr[1]; // Human {name: "crong", hp: 100, pow: 30}
// ์ด๋ ‡๊ฒŒ ๋ฐฐ์—ด arr ๋‚ด์˜ ๊ฐ’๋“ค์ด ๊ฐ์ฒด(p1, p2)๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.

arr[0].hp = 500;
p1; // Human {name: "honux", hp: 500, pow: 10, item: ["sowrd","shield","potion"]}
//์™œ ๋ฐ”๋€Œ๋Š”๊ฐ€? p1๋„ arr๋„ ๋ชจ๋‘ ๊ฐ์ฒด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” '์ฐธ์กฐ๋ณ€์ˆ˜'์ด๊ธฐ ๋•Œ๋ฌธ.

 

โž• ๊ฐ์ฒด ์•ˆ์— ๋ฐฐ์—ด/๊ฐ์ฒด, ๋ฐฐ์—ด ์•ˆ์— ๋ฐฐ์—ด/๊ฐ์ฒด ... ์ค‘์ฒฉํ•ด ๋„ฃ๊ธฐ ์˜ˆ์‹œ.

// ๊ฐ์ฒด ์•ˆ์— ๋ฐฐ์—ด, ๋ฐฐ์—ด ์•ˆ์— ๊ฐ์ฒด ... ๋„ฃ๊ธฐ ์˜ˆ์‹œ.
var p3 = new Human("pobi", 99);
p3; // Human {name: "pobi", hp: 100, pow: 99}

p1.friends = [p2, p3]
p1; 
// Human {
//  name: "honux",
//  hp: 500, 
//  pow: 10, 
//  item: ["sowrd","shield","potion"], 
//  friends: [Human {name: "crong", hp: 100, pow: 30}, 
//   		  Human {name: "pobi", hp: 100, pow: 99}]
//  }

p3.friend = p1;
p3;
// Human {
//  name: "pobi",
//  hp: 100, 
//  pow: 99, 
//  friends: Human {name: "honux", hp: 500, pow: 10, item: ["sowrd","shield","potion"], friends: [Human {name: "crong", hp: 100, pow: 30}, Human {name: "pobi", hp: 100, pow: 99}]}, 
//  }

p1.friends[1];
//  Human {
//  name: "pobi",
//  hp: 100, 
//  pow: 99, 
//  friends: Human {name: "honux", hp: 500, pow: 10, item: ["sowrd","shield","potion"], friends: [Human {name: "crong", hp: 100, pow: 30}, Human {name: "pobi", hp: 100, pow: 99}]}, 
//  }

p1.friends[1].friend;
// Human {
//  name: "honux",
//  hp: 500, 
//  pow: 10, 
//  item: ["sowrd","shield","potion"], 
//  friends: [Human {name: "crong", hp: 100, pow: 30}, 
//   		  Human {name: "pobi", hp: 100, pow: 99}]
//  }

p1.friends[1].friend.friends[0];
// Human {name: "crong", hp: 100, pow: 30}

// ์ด๋ ‡๊ฒŒ ์—ฌ๋Ÿฌ ๋ฒˆ ๊ฐ์ฒด ์•ˆ์— ๊ฐ์ฒด/๋ฐฐ์—ด์„, ๋ฐฐ์—ด ์•ˆ์— ๊ฐ์ฒด/๋ฐฐ์—ด์„ ๋„ฃ๊ณ  ๊บผ๋‚ด ์“ธ ์ˆ˜ ์žˆ๋‹ค.

delete(p1.friends)
//delete()๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ์ฒด์˜ ์†์„ฑ์„ ๋‹ค์‹œ ์ง€์šธ ์ˆ˜ ์žˆ๋‹ค.

 

 

๋ฐฐ์—ด, ๊ฐ์ฒด์™€ ์ฐธ์กฐ๋ณ€์ˆ˜

-๊ฐ์ฒด๋ฅผ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๋ฉด ๊ทธ ๋ณ€์ˆ˜๋Š” ์ฐธ์กฐ ๋ณ€์ˆ˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
-๋ฐฐ์—ด๋„ ๊ฐ์ฒด์ด๋ฏ€๋กœ, ๋ฐฐ์—ด์„ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๋ฉด ์—ญ์‹œ ์ฐธ์กฐ ๋ณ€์ˆ˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

-ํ•จ์ˆ˜ ํ˜ธ์ถœ์‹œ ์ฐธ์กฐ ๋ณ€์ˆ˜๋ฅผ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•˜๋ฉด, ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ๋ณ€๊ฒฝํ•œ ๊ฐ’์ด ์™ธ๋ถ€์—์„œ๋„ ๋ณ€๊ฒฝ๋œ๋‹ค๋Š” ๊ฒƒ ๊ผญ ๊ธฐ์–ตํ•˜์„ธ์š”.