๋ฐ์ํ
1๏ธโฃ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ด๋?
- ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ(Object-Oriented Programming, OOP)์ด๋ ๊ฐ์ฒด๋ฅผ ๋ฐ์ดํฐ ๋ชฉ๋ก์ผ๋ก ๋ณด๋ ์๊ฐ์์ ๋ฒ์ด๋ ๊ฐ๊ฐ ๋ ๋ฆฝ์ ์ธ ๊ธฐ๋ฅ์ ํ๋ ๋ถํ๊ณผ ๊ฐ์ด ์ํธ์์ฉํ๋๋ก ํ๋ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ๋ฒ๋ก .
- ์ถ์ํ ์์ ๋คํ์ฑ ์บก์ํ 4๊ฐ์ง์ ํน์ง์ ๊ฐ๊ณ ์์ผ๋ฉฐ, ์ค๊ณ์ ์ด์ ๋ค์ ๊ฐ์ฅ ์ ์ด๋ฆด ์ ์๋ ๋ฐฉํฅ์ผ๋ก ๊ฐ ๊ฐ์ฒด๋ค์ ์ญํ ์ ์ ์ํด ๋๊ฐ๋ ๊ฒ์ ์ด์ ์ ๋ง์ถฐ ํ๋ก๊ทธ๋๋ฐ์ ์งํํ๋ค.
- ๊ฐ์ฒด ์งํฅ์ ์ค๊ณ๋ฅผ ํตํด ์ง๊ด์ฑ๊ณผ ์ฌ์ฌ์ฉ์ฑ์ด ๋์ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ผ๋ฉฐ, ๋ฐ๋ณต ์์ด ๊ฐ๊ฒฐํ๊ณ ๋ณ๊ฒฝ์ด ์ฉ์ดํ ์ ์ฐํ ํ๋ก๊ทธ๋จ์ ๋ง๋ค ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค.
- ๋ํ์ ์ธ ๊ฐ์ฒด ์งํฅ ์ค๊ณ ์์๋ก class๊ฐ ์๋ค. ํด๋น ๊ฒ์๋ฌผ์์๋ ๊ฐ์ฒด๋ฆฌํฐ๋ด ํ๋กํ ํ์ ํด๋์ค์ ๋ํ ์์ ๋ฅผ ์๊ฐํ๊ณ ๊ฐ๋จํ๊ฒ ๊ธฐ๋ฅ์ ๋น๊ตํด ๋ณด๊ณ ์ ํ๋ค.
// 1. jay ๊ฐ์ฒด ์์ฑ.
const jay = {
name: '๐๐ปโ๏ธ Jay',
// cat์ Happiness๋ฅผ ์ฆ๊ฐ์ํค๋ care ํจ์ ์ ์ธ.
care: function (cat) {
cat.upLift();
}
}
// 2. cat ๊ฐ์ฒด ์์ฑ
const cat = {
name: '๐โฌ ๊ฐ์ฅ์ด',
happiness: 30,
// cat์ Happiness๋ฅผ 10 ์ฆ๊ฐ์ํค๋ upLift ํจ์ ์ ์ธ.
upLift: function () {
this.happiness += 10;
if (this.happiness < 50) {
console.log(`๐ ${this.name}์ ํจ๊ป ์๊ฐ์ ๋ณด๋ด์ฃผ์ธ์...๐ฟ`)
} else if (this.happiness < 100) {
console.log(`๐ ${this.name}์ ํ์ฌ ๋ง์กฑ๋๋ ${this.happiness}% ์
๋๋ค.`)
} else {
this.happiness = 100;
console.log(`๐ ${this.name}๋ ์ง๊ธ ์ต๊ณ ๋ก ํ๋ณตํด์!`)
}
}
}
// 3. care ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด์ cat ๊ฐ์ฒด๋ฅผ arguments๋ก ์ ๋ฌ.
jay.care(cat);
jay.care(cat);
jay.care(cat);
.
.
.
// 4. Console ๋ฐํ ํ๋ฉด.
๐ ๐โฌ ๊ฐ์ฅ์ด์ ํจ๊ป ์๊ฐ์ ๋ณด๋ด์ฃผ์ธ์...๐ฟ
๐ ๐โฌ ๊ฐ์ฅ์ด์ ํ์ฌ ๋ง์กฑ๋๋ 50% ์
๋๋ค.
.
.
.
๐ ๐โฌ ๊ฐ์ฅ์ด๋ ์ง๊ธ ์ต๊ณ ๋ก ํ๋ณตํด์!
2๏ธโฃ ์์ฑ์ ํจ์ Constructor ์ ์ธ์คํด์ค Instance
์์ฑ์ ํจ์
- ๊ฐ์ฒด๋ฅผ ๋ง๋ค ๋ new ์ฐ์ฐ์์ ํจ๊ป ์ฌ์ฉํ๋ ํจ์. Return ๊ฐ์ ๊ฐ์ง ํจ์๋ผ๋ ๊ฒ์ด ์ค์ํ ํฌ์ธํธ!
- ์์ฑ์ ํจ์์ ์ฅ์ ์ ์์ฑ์๋ฅผ ํตํด ์์ฑ๋ ๊ฐ์ฒด๋ ๊ฐ์ property์ Method๋ฅผ ๊ณต์ ํ ์ ์๋ค๋ ๊ฒ.
- ์์ฑ์ ํจ์๋ ์๋ฌต์ ์ผ๋ก ๋๋ฌธ์๋ก ์์ํ๋ ์ด๋ฆ์ ๊ฐ์ง๋ค
์ธ์คํด์ค
- ์์ฑ์ ํจ์๋ฅผ ํตํด ๋ฐํ๋์ด ์์ฑ๋ ๊ฐ์ฒด๋ฅผ ์ธ์คํด์ค(instance) ๋ผ๊ณ ํ๋ค.
- ๊ฐ์ฒด๊ฐ ํน์ ์์ฑ์ ํจ์๋ก ์์ฑ๋ ๊ฒ์ธ์ง ํ์ธ์ด ํ์ํ๋ฉด instanceof ์ฐ์ฐ์๋ฅผ ํ์ฉ.
- ์๋ ํจ์ ์์์์ this๋ ํจ์๋ฅผ ํธ์ถํ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ์ง๋ง
์์ฑ์ ํจ์ ์์ new ์ฐ์ฐ์๊ฐ ์ฌ์ฉ๋๋ฉด ํจ์ ์์ this๋ ์์ฑ์๊ฐ ๋ง๋ค์ด๋ธ ๊ฐ์ฒด ์ฆ, ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐ.
// 1. ์์ฑ์ ํจ์ Factory ์์ฑ
function Factory(name) {
this.name = name;
console.log(`์๋ฆฌ๋น๋ฆฌ. ์ ์ด๋ฆ์ ${this.name}์
๋๋ค.`);
}
// 2. instance ์์ฑ
let jayBot = new Factory('๐คJAY'); // = ์๋ฆฌ๋น๋ฆฌ. ์ ์ด๋ฆ์ ๐คJAY์
๋๋ค.โ
// 3. instanceof ์ฐ์ฐ์๋ฅผ ํตํด ์์ฑ์ ํจ์๋ก ์์ฑ๋ ๊ฐ์ฒด์ธ์ง ํ์ธ
jayBot instanceof Factory; // = true
3๏ธโฃ ํ๋กํ ํ์ (prototype)
- ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ ์ค๊ณ์์ ๋ค๋ฅธ ๊ฐ์ฒด์ ํ๋กํผํฐ์ ๋ฉ์๋๋ฅผ ์์๋ฐ์ ์ ์๋ค.
์์์ ๊ฐ์ฒด์ ์ฌ์ฌ์ฉ์ฑ์ ๋์ด๊ณ ์ฝ๋์ ์ค๋ณต์ ์ค์ด๋ ๋ฐฉ๋ฒ ์ค ํ๋. - JavaScript์์๋ ๊ฐ์ฒด์ ์์์ ์ํด prototype์ ์ฌ์ฉ.
- ์(2) ์์ ์ ๊ฐ์ด Object literal์ ํ์ฉํ๋ฉด ์์ฝ๊ฒ ๊ฐ์ฒด๋ฅผ ์์ฐํ ์ ์์ง๋ง, instance๋ฅผ ์์ฑํ ๋๋ง๋ค ์๋ก์ด ํจ์๋ฅผ ์์ฑํ๋ค.
- ํจ์ ์ค๋ณต ์ ์ธ์ผ๋ก ๋ฐ์๋๋ ๋ญ๋น๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ํน์ ๊ฐ์ฒด์ ํจ์๋ฅผ ์์์ํค๋ prototype ์์ฑ์ ํ์ฉํ ์ ์๋ค.
- ์์ฑ์ ํจ์๋ instance๋ฅผ ์์ฑํ๊ฒ ๋๋ฉด ์จ๊ฒจ์ง ์์ฑ์ธ Prototype์ด ์ถ๊ฐ๋์ด ์ฐ๊ฒฐ๋๋ค.
- ์ฆ, ์์ฑ์ ํจ์๋ ๋ถ๋ชจ ์ญํ ์ ํ๋ ๊ฐ์ฒด prototype์ด ๋๋ฉฐ ๊ณตํต์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ ์์ฑ์ ์ถ๊ฐํด์ ์์์ญํ ์ ํ๋ ๊ฐ์ฒด instance ์ ์์ํ ์ ์๋ค.
- ์์ฑ์ ํจ์๋ ํจ์๋ช .prototype ์ ํตํด์, instance ๋ ์ธ์คํด์ค๋ช .__proto__ ์ฝ๋๋ฅผ ํตํด์ prototype์ ์ ์ดํ๋ค.
- ์๋ ์์ ์ฝ๋์ ํ๋กํ ํ์ ๋ก์ง์ ๋น๊ตํด์ ํ์ธํ๋ฉด ๊ตฌ์กฐ๋ฅผ ์ฝ๊ฒ ์ดํดํ ์ ์์ ๊ฒ์ด๋ค.
// 1. GetProtoLv ๊ฐ์ฒด ์์ฑ
const GetProtoLv = {
name: 'JAY',
job: 'Frontend Developer',
level: 1,
levelUp: function () {
this.level++;
console.log(`๐ ${this.name} ๋ ๋ฒจ${this.level} ๋ฌ์ฑ!`);
}
};
// 2. GetProtoLv์ ์์ฑ์ ์์๋ฐ์ ๋น ์์ฑ์ ํจ์ getLearn() ์์ฑ
function getLearn(name) {
this.name = name
}
// 3. Object.create() ๋ฉ์๋๋ฅผ ํตํด GetProtoLv๋ฅผ ์ฐ๊ฒฐํด์ ์์ฑ์ ์์๋ฐ์ ์ ์๋๋ก ์ค์
getLearn.prototype = Object.create(GetProtoLv);
getLearn.prototype.code = function (lang) {
console.log(`๐ ${this.name}๋ ์ง๊ธ ${lang} ๊ณต๋ถ ์ค...`);
this.levelUp();
};
getLearn.prototype.read = function (book) {
console.log(`๐ ${this.name}๋ ์ง๊ธ ${book} ์ฝ๋ ์ค...`);
this.levelUp();
};
// 4. Instance ์์ฑ
const paul = new getLearn('Paul')
paul.code('React')
// ๐ Paul๋ ์ง๊ธ React ๊ณต๋ถ ์ค... ๐ Paul ๋ ๋ฒจ2 ๋ฌ์ฑ!
paul.read('Modern JavaScript')
// ๐ Paul๋ ์ง๊ธ Modern JavaScript ์ฝ๋ ์ค... ๐ Paul ๋ ๋ฒจ3 ๋ฌ์ฑ!
4๏ธโฃ Class
- class + ์ด๋ฆ + { constructor ... } ๋ก ๊ตฌ์ฑ.
- 2016๋ ES6 ๋ถํฐ ๋์ ๋ instance๋ฅผ ์์ฑํ๋ ์์ฑ์ ํจ์.
- ๊ฐ์ฒด๋ฅผ ์์ฐํ๋ ์์ฐ ๋๋ฉด ํน์ ์ฒญ์ฌ์ง์ด๋ ํํ์ ์์ฃผ ์ฌ์ฉ.
- ์๋ฐ์คํฌ๋ฆฝํธ๋ง์ ์ฌ์ฉ์ ์ ์ ํ์ ์์ฑ(๊ฐ์ฒด ์์ฑ) ๋ฐฉ๋ฒ์ ๋ค๋ฅธ ์ธ์ด์ ํด๋์ค ๋ฌธ๋ฒ์ฒ๋ผ ๋ฐ๊ฟ์ค ๊ฒ.
- ์ด์ฒ๋ผ ๋ด๋ถ์ ์ธ ๋์์ ๋์ผํ์ง๋ง ๋ ๋ณด๊ธฐ ์ข๊ณ ํธ๋ฆฌํ๊ฒ ๊ฐ์ ๋ ๋ฌธ๋ฒ์ ์๊ฐ์ ํ ์ค (Syntactic sugar) ๋ผ๊ณ ๋ถ๋ฅธ๋ค.
- class์ ์์ธํ ๊ธฐ๋ฅ๊ณผ ๋ฉ์๋์ ๋ํ ๋ด์ฉ์ ๋ฐ๋ก ๊ธฐ์ ํ ์์ !
์๋ ์์ ์ฝ๋์ ๋ก์ง์ ๋น๊ตํด์ ํ์ธํ๋ฉด class์ ๊ตฌ์กฐ๋ ์ฝ๊ฒ ์ดํดํ ์ ์๋๋ฐ
๊ธฐ์กด ์๋ฐ์คํฌ๋ฆฝํธ์ ํ๋กํ ํ์ (3) ํจํด๋ณด๋ค ํจ์ฌ ์ง๊ด์ ์ด๊ณ ๊ฐ๊ฒฐํ ๋ก์ง์ ๊ฐ๊ณ ์๋ ๊ฒ์ ์ ์ ์๋ค.
class GetClassLv {
constructor(name) {
this.name = name;
this.job = 'Frontend Developer';
this.level = 1;
}
code(lang) {
if (typeof lang !== 'string') {
throw new Error('Please pass in a string')
}
console.log(`๐ ${this.name}๋ ์ง๊ธ ${lang} ๊ณต๋ถ ์ค...`);
this.levelUp()
}
read(book) {
if (typeof book !== 'string') {
throw new Error('Please pass in a string')
}
console.log(`๐ ${this.name}๋ ์ง๊ธ ${book} ์ฝ๋ ์ค...`);
this.levelUp()
}
levelUp() {
this.level += 1;
console.log(`๐ ${this.name} ๋ ๋ฒจ${this.level} ๋ฌ์ฑ!`);
}
}
// instance ์์ฑ
const jay = new GetClassLv('JAY');
// instance method ํธ์ถ
jay.code('JavaScript')
jay.read('Modern JavaScript')
// = ๐ JAY๋ ์ง๊ธ JavaScript ๊ณต๋ถ ์ค... ๐ JAY ๋ ๋ฒจ2 ๋ฌ์ฑ!
// = ๐ JAY๋ ์ง๊ธ core JavaScript ์ฝ๋ ์ค... ๐ ๐ฉ๐ป๐ป JAY ๋ ๋ฒจ3 ๋ฌ์ฑ!
5๏ธโฃ Prototype ๊ณผ Class ์ฝ๋ ๋น๊ต
๐ฉ๐ป๐ป ์์ฝ
- ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ(Object-Oriented Programming, OOP)์ด๋ ๊ฐ์ฒด๋ฅผ ๋ฐ์ดํฐ ๋ชฉ๋ก์ผ๋ก ๋ณด๋ ์๊ฐ์์ ๋ฒ์ด๋ ๊ฐ๊ฐ ๋ ๋ฆฝ์ ์ธ ๊ธฐ๋ฅ์ ํ๋ ๋ถํ๊ณผ ๊ฐ์ด ์ํธ์์ฉํ๋๋ก ํ๋ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ๋ฒ๋ก .
- ๊ฐ์ฒด ์งํฅ ์ค๊ณ๋ฅผ ํตํด ํ๋ก๊ทธ๋จ์ ์ ์ฐํ๊ณ ๋ณ๊ฒฝ์ด ์ฉ์ดํ๊ฒ ๋ง๋ค ์ ์๋ค.
- ์์ฑ์ ํจ์๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ค ๋ new ์ฐ์ฐ์์ ํจ๊ป ์ฌ์ฉํ๋ ํจ์. ๋ฆฌํด ๊ฐ์ ๊ฐ์ง ํจ์๋ผ๋ ๊ฒ์ด ์ค์ํ ํฌ์ธํธ!
- ์์ฑ์ ํจ์๋ ๋ถ๋ชจ ์ญํ ์ ํ๋ ๊ฐ์ฒด prototype์ด ๋๋ฉฐ ๊ณตํต์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ ์์ฑ์ ์ถ๊ฐํด์ ์์์ญํ ์ ํ๋ ๊ฐ์ฒด instance ์ ์์ํ ์ ์๋ค.
- 2016๋ ES6 ๋ถํฐ ๋์ ๋ instance๋ฅผ ์์ฑํ๋ ์์ฑ์ ํจ์ Class๋ ๊ธฐ์กด JavaScript์ ์ฌ์ฉ์ ์ ์ ํ์ ์์ฑ(๊ฐ์ฒด ์์ฑ) ๋ฐฉ๋ฒ์ ๋ค๋ฅธ ์ธ์ด์ Class ๋ฌธ๋ฒ์ฒ๋ผ ๋ฐ๊ฟ์ค ๊ฒ. constructor() ๋ฉ์๋๋ฅผ ํตํด ํด๋์ค์ ์์ฑ์ ํจ์๋ฅผ ์ ์ํ๋ค.
๋ฐ์ํ