- ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์ ์ฐจ์งํฅ ํ๋ก๊ทธ๋๋ฐ๊ณผ๋ ๋ค๋ฅด๊ฒ ๋ฐ์ดํฐ๋ฅผ ํ ๊ณณ์ ๋ฌถ์ด ์ฒ๋ฆฌํจ
- ์์ฑ๊ณผ ๋ฉ์๋๊ฐ ํ๋์ '๊ฐ์ฒด' ๋ผ๋ ๊ฐ๋ ์ ํฌํจ๋๋ฉฐ, ์ด๋ JavaScript ๋ด์ฅ ํ์ object์๋ ๋ค๋ฅด๊ฒ, class๋ผ๋ ์ด๋ฆ์ผ๋ก ๋ถ๋ฆ
- ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ํ๋์ ๋ชจ๋ธ์ด ๋๋ ์ฒญ์ฌ์ง(blueprint)์ ๋ง๋ค๊ณ โ class
- ์ด๋ ๋ชจ๋ธ์ ์ฒญ์ฌ์ง์ ๋ง๋ค ๋ ์ฐ๋ ์ํ๊ฐ์ฒด(original form) โ prototype
- ๊ทธ ์ฒญ์ฌ์ง์ ๋ฐํ์ผ๋ก ํ ๊ฐ์ฒด(object)๋ฅผ ๋ง๋๋ ํ๋ก๊ทธ๋๋ฐ ํจํด โ instance
let counter1 = {
value: 0;
increase: function() {
this.value++ // ๋ฉ์๋ ํธ์ถ์ ํ ๊ฒฝ์ฐ, this๋ counter1์ ๊ฐ๋ฆฌํด
},
decrease: function() {
this.value--
},
getValue: function() {
return this.value
}
}
counter1.increase()
counter1.decrease()
counter1.increase()
counter1.decrease()
counter1.getValue() // 2
function makeCounter() {
let value = 0;
return {
increase: function () {
value++;
},
decrease: function () {
value--;
},
getValue: function () {
return value;
}
}
}
let counter1 = makeCounter()
counter1.increase()
counter1.getValue() // 1
let counter2 = makeCounter()
counter2.decrease()
counter2.decrease()
counter2.getValue() // -2
class Car {
constructor (brand, name, color) {
// ์ธ์คํด์ค๊ฐ ๋ง๋ค์ด์ง ๋(= ์ด๊ธฐํ๋ ๋) ์คํ๋๋ ์ฝ๋: constructor(์์ฑ์)
// ์ฐธ๊ณ ๋ก ์์ฑ์ ํจ์๋ return ๊ฐ์ ๋ง๋ค์ง ์์
}
}
let avante = new Car('hyundai', 'avante', 'black');
// ์ธ์คํด์ค๋ฅผ ๋ง๋ค ๋๋ new ํค์๋ ์ฌ์ฉ
// ๊ฐ๊ฐ์ ์ธ์คํด์ค๋ Car ๋ผ๋ ํด๋์ค์ ๊ณ ์ ํ ์์ฑ๊ณผ, ๋ฉ์๋๋ฅผ ๊ฐ์ง
- parameter๋ก ๋์ด์จ ๋ธ๋๋, ์ด๋ฆ, ์์ ๋ฑ์ ์ธ์คํด์ค ์์ฑ ์ ์ง์ ํ๋ ๊ฐ
- this์ ํ ๋นํ๋ค๋ ๊ฒ์ ๋ง๋ค์ด์ง ์ธ์คํด์ค์ ํด๋น ํด๋น ๋ธ๋๋, ์ด๋ฆ, ์์์ '๋ถ์ฌ'ํ๊ฒ ๋ค๋ ์๋ฏธ
- ํจ์๊ฐ ์คํ๋ ๋ ํด๋น scope๋ง๋ค ์์ฑ๋๋ ๊ณ ์ ํ ์คํ context
- new ํค์๋๋ก ์ธ์คํด์ค๋ฅผ ์์ฑํ์ ๋๋ ํด๋น ์ธ์คํด์ค๊ฐ ๋ฐ๋ก this ๊ฐ์ด ๋จ
์์ฑ์ ํจ์์ ํจ๊ป class ํค์๋ ์์ชฝ์ ๋ฌถ์ด์ ์ ์
class Car {
constructor(brand, name, color) {/* ์๋ต */}
refuel() {
}
drive() {
}
}
์ธ์คํด์ค์์์ ์ฌ์ฉ: ์์์ ์ค์ ํ ์์ฑ๊ณผ ๋ฉ์๋๋ฅผ ์ธ์คํด์ค์์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
let avante = new Car('hyundai', 'avnante', 'black');
avante.color; // 'black'
avante.drive(); // ์๋ฐ๋ผ๊ฐ ์ด์ ์ ์์ํฉ๋๋ค
let mini = new Car('bmw', 'mini', 'white');
mini.brand; // 'bmw'
mini.refuel(); // ๋ฏธ๋์ ์ฐ๋ฃ๋ฅผ ๊ณต๊ธํฉ๋๋ค
// constructor(์์ฑ์) ํจ์
function Car (brand, name, color) { // Car๋ class
this.brand = brand; // ์ฌ๊ธฐ์ avante === this
this.name = name;
this.color = color;
}
// Car.prototype ๊ฐ์ฒด: ์ฌ๊ธฐ์ ์์ฑ์ด๋ ๋ฉ์๋๋ฅผ ์ ์ํ ์ ์์
Car.prototype.drive = function() {
console.log(this.name + '๊ฐ ์ด์ ์ ์์ํฉ๋๋ค');
}
let avante = new Car('hyundai', 'avante', 'black'); // avante: instance
avante.color; // 'black'
avante.drive(); // 'avante๊ฐ ์ด์ ์ ์์ํฉ๋๋ค'
- ์ ์ฐจ์ ์ธ์ด: ์์ฐจ์ ์ธ ๋ช ๋ น์ ์กฐํฉ
- ๊ฐ์ฒด ์งํฅ ์ธ์ด: class ๋ผ๋ ๋ฐ์ดํฐ ๋ชจ๋ธ์ ์ฒญ์ฌ์ง์ ์ด์ฉํด ์ฝ๋๋ฅผ ์์ฑํ๋ฉฐ, ๋ฐ์ดํฐ์ ๊ธฐ๋ฅ์ด ํ๋ฒ์ ๋ฌถ์ฌ์ ์ฒ๋ฆฌ๋จ.
- JavaScript๋ ๊ฐ์ฒด ์งํฅ ์ธ์ด๋ ์๋์ง๋ง, ๊ฐ์ฒด ์งํฅ ํจํด์ผ๋ก ์์ฑ ๊ฐ๋ฅ
- ๋ฐ์ดํฐ์ ๊ธฐ๋ฅ์ ํ๋์ ๋จ์๋ก ๋ฌถ๋ ๊ฒ
- ์๋(Hiding): ๊ตฌํ์ ์จ๊ธฐ๊ณ , ๋์์ ๋ ธ์ถ
- ๋์จํ ๊ฒฐํฉ(Loose Coupling)์ ์ ๋ฆฌ: ์ฝ๋ ์คํ ์์์ ๋ฐ๋ผ ์ ์ฐจ์ ์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์๋๋ผ, ์ฝ๋๊ฐ ์์งํ๋ ์ค์ ๋ชจ์ต๊ณผ ๋ฎ๊ฒ ์ฝ๋๋ฅผ ๋ชจ์ ๊ฒฐํฉ, ์ธ์ ๋ ๊ตฌํ ์์ ๊ฐ๋ฅ
- ์ฝ๋๊ฐ ๋ณต์กํ์ง ์๊ณ ์ฌ์ฌ์ฉ์ฑ์ ๋์
- ๋ถ๋ชจ, ์ฆ ๊ธฐ๋ณธ ํด๋์ค(base class)์ ํน์ง์ ์์, ์ฆ ํ์ ํด๋์ค(derived class)๊ฐ ์์๋ฐ๋ ๊ฒ
- ์ฝ๋๊ฐ ๋จ์ํ๊ณ ์ฌ์ฌ์ฉ์ฑ์ ๋์
- ๋ด๋ถ ๊ตฌํ์ ๋ณต์ก but ์ค์ ๋ ธ์ถ๋๋ ๋ถ๋ถ์ ๋จ์ํ๊ฒ ๋ง๋ค์ด, ์๊ธฐ์น ๋ชปํ ์ฌ์ฉ์์ ๋ณํ ๋ฐฉ์ง
- ์บก์ํ๋ ๋ฐ์ดํฐ์ ์๋์ ์ค์ฌ์ ๋ง์ถ๊ณ , ์ถ์ํ๋ ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋์ด ๋ถํ์ํ ๋ฉ์๋ ๋ฑ์ ๋ ธ์ถ์ํค์ง ์๊ณ , ๋จ์ํ ์ด๋ฆ์ผ๋ก ์ ์ํ๋ ๊ฒ์ ์ค์ฌ.
- ์ฝ๋๊ฐ ๋ณต์กํ์ง ์๊ณ ๋ณํ์ ๋ํ ์ํฅ ์ต์ํ
- ex) ๊ฐ์ ์ด๋ฆ์ ๊ฐ์ง ๋ฉ์๋๋ผ๋ ๊ฐ ์์์ ์กฐ๊ธ์ฉ ๋ค๋ฅด๊ฒ ์ ์ฉ๋จ
- ๋์ผํ ๋ฉ์๋์ ๋ํด if/else์ ๊ฐ์ ์กฐ๊ฑด๋ฌธ ๋์ , ๊ฐ ๊ฐ์ฒด์ ํน์ฑ์ ๋ง๊ฒ ๋ค๋ฅด๊ฒ ์์ฑ ๊ฐ๋ฅ
JavaScript๋ ํ๋กํ ํ์ ๊ธฐ๋ฐ ์ธ์ด๋ก, ํ๋ก๋กํ์ ์ ์ํ ๊ฐ์ฒด๋ฅผ ์๋ฏธ
class Human {
constructor(name, age) {
this.name = name;
this.age = age;
}
sleep() {
console.log(`${this.name}์ ์ ์ ๋ค์์ต๋๋ค`);
}
}
let kimcoding = new Human('๊น์ฝ๋ฉ', 30);
Human.prototype.constructor === Human; // true
Human.prototype === kimcoding.__proto__; // true
Human.prototype.sleep === kimcoding.sleep; // true
๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ํน์ฑ ์ค, ์์์ ๊ตฌํํ ๋๋ ํ๋กํ ํ์ ์ฒด์ธ ์ฌ์ฉ