Bibi's DevLog ๐ค๐
[์ธํ๋ฐ] Javascript์ ๋ฌธ - ๊ฐ์ฒด 1 ๋ณธ๋ฌธ
[์ธํ๋ฐ] Javascript์ ๋ฌธ - ๊ฐ์ฒด 1
๋น๋น bibi 2020. 10. 13. 15:30* ์ด ๊ธ์ ์ธํ๋ฐ์์ ์ ๊ณตํ๋ ํธ๋ ์ค๋์ ์ ๋ฃ ๊ฐ์ '์ฝ๊ณ ์์ฐ์ค๋ฝ๊ฒ ๋ฐฐ์๋ณด๋ Javascript ์ ๋ฌธ - ์ฝ๋์ค์ฟผ๋ ๋ง์คํฐ์ฆ ์ฝ์ค ๋ ๋ฒจ1'๋ฅผ ๋ฃ๊ณ ๊ณต๋ถํ๋ฉฐ ์ ๋ฆฌํ ๊ธ์ ๋๋ค. ๊ฐ์ ๋ด์ฉ์ ๋ํด, ์ ๊ฐ ํ๊ธฐํ๊ณ ๊ตฌ๊ธ๋งํ ๋ด์ฉ์ด ์ ๋ฆฌ๋์ด ์์ต๋๋ค. ์ด๋ณด์ธ ์ ๊ฐ ์ดํดํ ๋๋ก ์ ๋ฆฌํ๊ธฐ ๋๋ฌธ์, ๋ถ์ ํํ ๋ด์ฉ์ด ์์ ์ ์์์ ๊ฐ์ํด ์ฃผ์๊ธธ ๋ฐ๋๋๋ค. ๊ฐ์๋ฅผ ๋ฃ๊ณ ๋ด์ฉ์ ์ ๋ฆฌํ ๊ธ์ด๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ๋์ง ์๋๋ค๋ ์ธํ๋ฐ ์ธก ๋ต๋ณ์ ๋ฐ์ ์ ์ด ์์ผ๋(https://bibi6666667.tistory.com/37), ์ ์๊ถ์ ๋ฌธ์ ๊ฐ ๋๋ค๋ฉด ๋ณดํธ ๋ชจ๋(๋น๊ณต๊ฐ)๋ก ์ ํํ๊ฒ ์ต๋๋ค.
๊ฐ์ฒดobject์ ๊ธฐ์ด
๊ฐ์ฒดobject ๋ ๋ฌด์์ธ๊ฐ?
- ํ์ค์ ๋ฌผ์ฒดobject์ ๋์๋๋ ๊ฐ๋ ์ ๋๋ค.
- ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ฉด ๋ณ์์ ํจ์๋ฅผ ๋ฌถ์ด์ ๊ด๋ฆฌํ๊ฒ ๋ฉ๋๋ค.
(= ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ๋๋, ๋ณ์์ ํจ์๋ฅผ ์๋ฏธ์๋ ๋จ์๋ก ๋ฌถ์ด์ ๊ด๋ฆฌํ๋ค.) - ๊ฐ์ฒดobject ๋ ์์ฑproperty๊ณผ ๋ฉ์๋method๋ฅผ ๊ฐ์ง๋๋ค.
๊ฐ์ฒด ๋ง๋ค๊ธฐ
๋น์ด ์๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ค ๋๋ ์ค๊ดํธ{} ์์ ์ฌ์ฉํ๋ค.
(โป๋ฐฐ์ด์ ๋๊ดํธ[]๋ฅผ ์ฌ์ฉํ๋ค)
var p1 = {};
typeof p1; // 'object' (๊ฐ์ฒด)
์์ฑ property
๊ฐ์ฒด์ ๋ณ์, ์ฆ ๊ฐ์ฒด์ ์ํ ๋ณ์ ๋ฅผ ์์ฑ์ด๋ผ๊ณ ํ๋ค.
.
์ . ์์ฑ ๋ฐ ๋ฉ์๋์ ์ ๊ทผํ ๋ ์ฌ์ฉํ๋ ํ๊ธฐ๋ฒ.
p1.name = "crong"; // p1์ด๋ผ๋ ๊ฐ์ฒด์ name์ "crong"์ด๋ผ๊ณ ํ๋ค.
console.log(p1.name); // "crong"
p1; // {name: "crong"} ๊ฐ์ฒด p1์ ๋ชจ์ต.
p1.name = "honux"; // ๋ด์ฉ์ ๋ฐ๊ฟ ์๋ ์๋ค.
console.log(p1.name); // "honux"
๋ฉ์๋ method
๊ฐ์ฒด์ ํจ์, ์ฆ ๊ฐ์ฒด์ ์ํ ํจ์ ๋ฅผ ๋ฉ์๋๋ผ๊ณ ํ๋ค.
// ๊ฐ์ฒด p1์ name์ด๋ผ๋ ์์ฑ์ ๋ฃ์.
p1.name = "honux"
// ๊ฐ์ฒด p1์ eat์ด๋ผ๋ ๋ฉ์๋๋ฅผ ์ฐ๊ฒฐํด ๋ณด์.
// ์ผ๋ฐ์ ์ธ ํจ์์ ์ฌ์ฉ๋ฐฉ๋ฒ์ ๊ฑฐ์ ๊ฐ๋ค.
p1.eat = function(food) {
console.log( food + "๋ฅผ ๋จน์ต๋๋ค." );
};
p1.eat("Beef"); // Beef๋ฅผ ๋จน์ต๋๋ค.
p1; // {name: "honux", eat: f} ***f๋ function์ด๋ผ๋ ๋ป.
// ์ฆ ๊ฐ์ฒด p1์ name์ด๋ผ๋ ์์ฑ๊ณผ eat์ด๋ผ๋ ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ฒ ๋์๋ค.
๊ฐ์ฒด์ ๋ฉ์๋ ๋์ ์ ์ผ๋ฐ ํจ์๋ฅผ ์ผ๋ค๋ฉด?
// eat์ด ๋ฉ์๋๊ฐ ์๋ ํจ์์๋ค๋ฉด ์๋์ ๊ฐ์ด ์ฌ์ฉํ์ ๊ฒ.
eat(p1, "์ฌ์ด๋ค"); // p1์ด ์ฌ์ด๋ค๋ฅผ ๋จน๋๋ค.
๋ฉ์๋ ๋์ ์ผ๋ฐ ํจ์๋ฅผ ์ผ๋ค๋ฉด ์์ ๊ฐ์ด ์ฌ์ฉ๋์์ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๋ ์ด๋ ๊ฒ ์ฝ๋ฉํ์ ๋๋ ์๋ฏธ๊ฐ ๋ฐ๋ก ์๋ฟ์ง ์๋๋ค.
(eat๋ p1๊ณผ "Beef"๋ผ๋ ๋งค๊ฐ๋ณ์๋ฅผ ๊ฐ๋ ํจ์์ด๊ตฐ. ์ ๋)
p1.eat("์ฌ์ด๋ค");
๋ฐ๋ฉด ์ด์ฒ๋ผ p1์ ๊ฐ์ฒด๋ก ์ฌ์ฉํ๋ฉด, eat๋ p1์ ํจ์ ์ฆ ๋ฉ์๋์ด๊ณ
p1์ด ์ฌ์ด๋ค๋ฅผ eatํ๋ค๋ ์๋ฏธ๊ฐ ๋ ๋ช
ํํ๊ฒ ์ ๋ฌ๋๋ค.
์ฆ..
ํจ์ ๋์ ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ์ด์ ?
-> ํจ์๋ฅผ ๋ฌถ์ด์ ์ฌ์ฉํด ์๋ฏธ๋ฅผ ๋ช
ํํ๊ฒ ํ๊ณ , ๊ฐ๋
์ฑ์ ๋์ด๊ธฐ ์ํด.
๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ OOP
๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ Object-Oriented Programing, OOP ์ด๋?
-> ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด, ๋ณ์์ ํจ์๋ฅผ ๋ฌถ์ด์ ์ฝ๋๋ฅผ ๊ตฌํํ๊ณ ๊ด๋ฆฌํ๋ ๊ฒ.
(์ฐธ๊ณ : velog.io/@hkoo9329/OOPObject-Oriented-Programming-%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EC%9D%B4%EB%9E%80)
๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์ฅ์
- ์ ์ง๋ณด์๊ฐ ์ฌ์์ง๋ค.
- ๊ฐ๋ ์ฑ์ด ๋์์ง๋ค.
- ๋ํ ํ๋ก๊ทธ๋จ์ ์ง๊ธฐ ์ฌ์์ง๋ค.
-> ์ด๋ฐ ์ฅ์ ๋ค ๋๋ฌธ์, '๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ'์ ํ ์๋์ ์ค์ํ ํ๋ก๊ทธ๋๋ฐ ์ปจ์ ์ผ๋ก ์๋ฆฌ์ก์๋ค.
๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ํ๋ ๋ฒ
-> ์ด๋ค ํ๋ก๊ทธ๋จ์ ์งค ๋, ๊ฐ์ฒด ์ค์ฌ์ผ๋ก logic์ ์ง๊ณ ์ฝ๋ฉ์ ํ๋ค.
์ฐ์ ํ์ํ ๊ฐ์ฒด๋ค์ ์๊ฐํ๊ณ , ๊ฐ ๊ฐ์ฒด๋ค์ด ์ด๋ค ์ผ์ ํ๋์ง, ์ด๋ค ๊ฐ์ฒด๋ค์ด ํ๋ ฅํ๋์ง, .. ๋ฅผ ๊ณ ๋ คํด ์ค๊ณํ๋ค.
- ๊ฐ์ฒด์ ๊ฐ์ฒด๊ฐ ํ๋ ฅํด์ ์ผ์ ํ๋ค.
- ๊ฐ์ฒด๋ ์ผ์ ์ฑ ์์ ์ง๋ค.
- ๊ฐ์ฒด๋ ๊ฐ์ฒด์ ๋ฉ์์ง๋ฅผ ๋ณด๋ธ๋ค.
- ๊ฐ์ฒด๋ ์์จ์ ์ผ๋ก ์ผ์ ํ๋ค.
โป ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์ํด์๋ ์ฐธ๊ณ ๋์๋ฅผ ๋ณด๋ฉด ์ข๋ค. "(ํ๋ก๊ทธ๋๋ฐ์ธ์ด) + ๊ฐ์ฒด์งํฅํ๋ก๊ทธ๋๋ฐ".
ex. Javascript ๊ฐ์ฒด์งํฅํ๋ก๊ทธ๋๋ฐ
์ง๊ธ์ ์์ด๋ณด๋ ๋ฒจ1์ด๊ธฐ ๋๋ฌธ์ ๊ฐ์ฒด๋ฅผ ์์ ํ ์ดํดํ๋ ๊ฒ ์์ฒด๊ฐ ์ด๋ ต๋ค.
์ฐ์ '๊ฐ์ฒด๊ฐ ์๋ค' ์ ๋๋ง ์ดํดํ์.
this ํค์๋
this๋ (๊ฐ์ฒด์) ๋ฉ์๋ ๋ด์์ ์ฌ์ฉํ ์ ์๋ ๊ฐ๋
์ด๋ค.
(๋ฐ๋ณต๋ฌธ์์ break๋ฅผ, ํจ์์์ return์ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ฒ๋ผ)
this
: (๋ฉ์๋ ์์์ ์ฌ์ฉ์) ํจ์๋ฅผ ์์ ํ ๊ฐ์ฒด ์์ฒด๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
์ฆ ๊ฐ์ฒด ๋ฉ์๋์ ํจ์ ๊ตฌ๋ฌธ ๋ด์์, ๊ฐ์ฒด ์์ ์ ๊ฐ๋ฆฌํค๋ ๋ง์ด๋ค.
** this๋ฅผ ์ ์ฐ๋๊ฐ?
Q. ๋ฉ์๋ ๋ด์์๋ this.name ๋์ p2.name์ ์ฌ์ฉํ๋ฉด ๋์ง ์๋๊ฐ?
A. ๋ฉ์๋ ๋ด๋ถ์์๋ ๋ฉ์๋ ๋ฐ๊นฅ์ชฝ์ ์๋ ๊ฐ์ฒด p2๋ฅผ ์ธ์ํ ์ ์๋ค.
๋ฐ๋ผ์ p2.name์ฒ๋ผ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ this๋ฅผ ์ฌ์ฉํ๋ ๊ฒ.
** Q. ์ ์ด๋จ ๋๋ this๊ฐ ์๋๋ผ p2.name์ฒ๋ผ ์ฌ์ฉํด๋ ๋์ํ๋๊ฐ?
๋ฌธ๋ฒ์ ํ๋ ธ์ง๋ง, javascript์์ ์์์ ๋์ํด ์ฃผ๋ ๊ฒ.
์ง๊ธ ๋จ๊ณ์์ ์์์ผ ํ๋ ๋ด์ฉ์ ์๋์ง๋ง.. ๋ ๊ณต๋ถํ๋ ค๋ฉด https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/this๋ฅผ ์ฐธ๊ณ ํด๋ผ.
var p2 = {}; // p2๋ผ๋ ๊ฐ์ฒด ์์ฑ.
p2.name = "crong"; // ๊ฐ์ฒด p2์ ์์ฑ name์ 'crong'
p2.weight = 100; // ๊ฐ์ฒด p2์ ์์ฑ weight๋ 100
p2.eat = function(food) {
console.log(this.name + "์ด " + food + "๋ฅผ ๋จน์์ต๋๋ค.");
this.weight += 1;
console.log(this.name + "์ ํ์ฌ ๋ชธ๋ฌด๊ฒ๋ " + this.weight + "์
๋๋ค.");
}; // ๊ฐ์ฒด p2์ ๋ฉ์๋ eat์ ๋ง๋ฆ.
๊ฐ์ฒด ๋ง๋ค๊ธฐ2
๊ฐ์ฒด๋ฅผ ๋ง๋ค ๋, ๋น์ด ์๋ ๊ฐ์ฒด์์ ๊ฐ์ ์ถ๊ฐํ๋ ๊ฒ ์๋๋ผ
์ฒ์๋ถํฐ ์์ฑ๊ณผ ๋ฉ์๋๋ฅผ ์ ์ํด ๊ฐ์ฒด๋ฅผ ๋ง๋ค ์๋ ์๋ค.
-> JSON ํ๊ธฐ๋ฒ์ ์ด์ฉํ๋ฉด ๊ฐ๋ฅํ๋ค.
JSON
: JavaScript Object Notation. ์ฆ '์๋ฐ์คํฌ๋ฆฝํธ์์ ๊ฐ์ฒด๋ฅผ ํ๊ธฐํ๋ ๋ฐฉ๋ฒ' ์ด๋ผ๋ ๋ป์ด๋ค.
JSONํ์์ ์๋์ ๊ฐ์ ํ๊ธฐ๋ฐฉ์์ด๋ค.
var ๊ฐ์ฒด๋ช
= {
"์์ฑ๋ช
" : ๊ฐ,
"์์ฑ๋ช
" : ๊ฐ,
..
"๋ฉ์๋๋ช
" : function(๋งค๊ฐ๋ณ์) {
//ํจ์๋ด์ฉ
},
"๋ฉ์๋๋ช
" : function(๋งค๊ฐ๋ณ์) {
//ํจ์๋ด์ฉ
},
..
};
์์
var m1 = {
"name": "Honux",
"hp": 100,
"power": 20,
"attack": function(target) {
target.hp -= this.power;
}
};
// JSONํ๊ธฐ๋ฒ์ ์ด์ฉํด, ์ฒ์๋ถํฐ m1์ด๋ผ๋ ๊ฐ์ฒด์
//์ธ ๊ฐ์ง ์์ฑ(name, hp, power)๊ณผ ํ ๊ฐ์ง ๋ฉ์๋(attack)๋ฅผ ์ ์ํ๊ณ ์๋ค.
// ๋ฉ์๋ attack : target์ hp๋ฅผ this(=m1)์ power๋งํผ ๋นผ๋ ํจ์.
m1.attack(m1); // ์๊ธฐ ์์ ์ ๊ณต๊ฒฉํ๋ฉด..
m1; // {name: "honux", hp: 80, power: 20, attack: f} hp๊ฐ m1์ power์ธ 20๋งํผ ๊น์๋ค.
+์์ฉ
//m1์ ์๋ก์ด ๋ฉ์๋ eat๋ฅผ ๋ง๋ค์ด ๋ณด์.
m1.eat = function(c1) {
this.hp += c1.energy;
}; // m1์ด c1์ด๋ผ๋ ๋ณ์๋ฅผ eatํ๋ฉด m1์ hp๊ฐ c1์ energy๋งํผ ๋ํด์ง๋ค.
// ๋จน์ ๊ฐ์ฒด c1์ ๋ง๋ค์.
var c1 = {
type: "Coffee",
energy: 10
};
m1.eat(c1);
m1;
// {name: "Honux", hp: 90, power: 20, attack: f, eat: f} f๋ ํจ์๋ผ๋ ๋ป.
*์์ฑ์ ํจ์๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ๋ ์์ง๋ง ๋ค์์ ๋ค๋ฃจ๊ฒ ์ต๋๋ค.
(๊ฐ์ฒด๋ฅผ ๋ง๋๋ ์ธ ๊ฐ์ง ๋ฐฉ๋ฒ
-๋น์ด์๋ ๊ฐ์ฒด {} ๋ง๋ค๊ณ ์์ฑ,๋ฉ์๋ ๋ฃ๊ธฐ
-JSONํ๊ธฐ๋ฒ ์ด์ฉํ๊ธฐ
-์์ฑ์ ํจ์ ์ด์ฉํ๊ธฐ)
โป ์ค๋ ๊ฐ์์ ์ฒดํฌํฌ์ธํธ
-๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด๋ผ ์ ์๋๊ฐ?
-this๋ฅผ ์ฌ์ฉํ ์ ์๋๊ฐ?