Bibi's DevLog ๐ค๐
[์ธํ๋ฐ]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()๋ฅผ ์ฌ์ฉํด ๊ฐ์ฒด์ ์์ฑ์ ๋ค์ ์ง์ธ ์ ์๋ค.
๋ฐฐ์ด, ๊ฐ์ฒด์ ์ฐธ์กฐ๋ณ์
-๊ฐ์ฒด๋ฅผ ๋ณ์์ ํ ๋นํ๋ฉด ๊ทธ ๋ณ์๋ ์ฐธ์กฐ ๋ณ์๊ฐ ๋ฉ๋๋ค.
-๋ฐฐ์ด๋ ๊ฐ์ฒด์ด๋ฏ๋ก, ๋ฐฐ์ด์ ๋ณ์์ ํ ๋นํ๋ฉด ์ญ์ ์ฐธ์กฐ ๋ณ์๊ฐ ๋ฉ๋๋ค.
-ํจ์ ํธ์ถ์ ์ฐธ์กฐ ๋ณ์๋ฅผ ๋งค๊ฐ ๋ณ์๋ก ์ ๋ฌํ๋ฉด, ํจ์ ๋ด๋ถ์์ ๋ณ๊ฒฝํ ๊ฐ์ด ์ธ๋ถ์์๋ ๋ณ๊ฒฝ๋๋ค๋ ๊ฒ ๊ผญ ๊ธฐ์ตํ์ธ์.