Demystifying ES6 Classes And Prototypal Inheritance - Lee-hyuna/33-js-concepts-kr GitHub Wiki
ES6 ํด๋์ค์ ํ๋กํ ํ์ ์์ ์ดํดํ๊ธฐ
JavaScript์ธ์ด์ ์ด๊ธฐ ์ญ์ฌ์์ ๋๋ถ๋ถ์ ๊ฐ์ฒด ์งํฅ ์ธ์ด์ ๊ฐ์ ํด๋์ค๋ฅผ ์ ์ํ๊ธฐ ์ํ ์ ์ ํ ๊ตฌ๋ฌธ์ด ๋ถ์กฑํ์ฌ ์ ๋๊ฐ์ ๊ตฌ๋ฆ์ด ํ์ฑ๋์์ต๋๋ค. 2015๋
ES6
๊ท๊ฒฉ์ด ๊ณต๊ฐ๋๊ธฐ ์ ๊น์ง class
ํค์๋๊ฐ ๋์
๋์ง ์์์ต๋๋ค. ๊ทธ๊ฒ์ ๊ธฐ์กด์ ํ๋กํ ํ์
๊ธฐ๋ฐ ์์์ ๋ํ ๊ตฌ๋ฌธ์ ์คํ(syntactical sugar)์ผ๋ก ๋ฌ์ฌ๋ฉ๋๋ค.
๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์์ค์์,ES6
์ class
ํค์๋๋ ํ๋กํ ํ์
๊ธฐ๋ฐ ์์์ ๋ถํฉํ๋ ์์ฑ์ํจ์ ์ ์์ ๊ฐ์ต๋๋ค. ์ด๋ฏธ ์กด์ฌํ๋ ๊ธฐ๋ฅ์ ๊ฐ์ธ๊ธฐ ์ํด new ํค์๋๊ฐ ๋์
๋์์ง๋ง ์ฝ์ ์์๋ ์ฝ๋๋ก ์ด์ด์ง๊ณ ๋ฏธ๋์ ๊ฐ์ฒด ์งํฅ์ ์ธ ๊ธฐ๋ฅ์ ๊ตฌ์ถํ ์ ์๋ ๊ธฐ๋ฐ์ ๋ง๋ จํ๋ ๊ฒ์ ์ค๋ณต์ ์ผ๋ก ๋ณด์ผ ์ ์์ต๋๋ค.
ES6
์ด์ ์ ๋์ผํ ์ ํ์ ๋ง์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ธฐ์ํ blueprint(ํด๋์ค)์ ์์ฑํด์ผํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ์์ฑ์ ํจ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
function Animal (name, fierce) {
Object.defineProperty(this, 'name', {
get: function() { return name; }
});
Object.defineProperty(this, 'fierce', {
get: function() { return fierce; }
});
}
Animal.prototype.toString = function() {
return 'A' + ' ' + ( this.fierce ? 'fierce' : 'tame' ) + ' ' + this.name;
}
์ด๊ฒ์ Animal
ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ธฐ์ํ blueprint์ ๋ํ๋ด๋ ๊ฐ๋จํ ๊ฐ์ฒด ์์ฑ์์
๋๋ค. ์ฐ๋ฆฌ๋ ์์ฑ์ํจ์์ ๋ ๊ฐ์ ์ฝ๊ธฐ ์ ์ฉ own
ํ๋ผํผํฐ์ ์ปค์คํ
toString
๋ฉ์๋๋ฅผ ์ ์ํ์ต๋๋ค. new ํค์๋๋ก Animal
์ธ์คํด์ค๋ฅผ ์์ฑ ํ ์ ์์ต๋๋ค :
var Lion = new Animal('Lion', true);
console.log(Lion.toString()); // "A fierce Lion"
์ข์! ๊ทธ๊ฒ์ ์์๋๋ก ์๋ํฉ๋๋ค. ๊ฐ๊ฒฐํ ๋ฒ์ ์ ์ํด ES6ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋๋ฅผ ๋ค์ ์์ฑํ ์ ์์ต๋๋ค.
class Animal {
constructor(name, fierce){
this._name = name;
this._fierce = fierce;
}
get name() {
return this._name;
}
get fierce() {
return ` This animal is ${ this._fierce ? 'fierce' : 'tame' }`;
}
toString() {
return `This is a ${ this._fierce ? 'fierce' : 'tame' } ${this._name}`;
}
}
์ด์ ์ฒ๋ผ new ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ Animal
ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋ง๋ญ๋๋ค.
let Lion = new Animal('Lion', true);
console.log(Lion.fierce);
console.log(Lion.toString())
ES6
์์ ํด๋์ค๋ฅผ ์ ์ํ๋ ๊ฒ์ ๋งค์ฐ ๊ฐ๋จํ๋ฉฐ ๊ฐ์ฒด ์์ฑ์๋ฅผ ์ฌ์ฉํ๋ ์ด์ ์๋ฎฌ๋ ์ด์
๋ณด๋ค ๊ฐ์ฒด ์งํฅ์ ์ธ ๋๋์ด ๋ ์์ฐ์ค๋ฝ์ต๋๋ค.
ES6
ํด๋์ค์ ์์ฑ๊ณผ ํ๊ธ ํจ๊ณผ๋ฅผ ํ๊ตฌํ์ฌ ES6
ํด๋์ค๋ฅผ ์ฌ์ธต์ ์ผ๋ก ์ดํด๋ด
์๋ค.
Defining Classes
class
ํค์๋๋ ๋จ์ง ํน๋ณํ function
์ด๊ณ ์์ ๋ ํจ์ ํ์๋ฅผ ๋ณด์ฌ์ฃผ๊ธฐ ๋๋ฌธ์ ์ด์ ๊ฐ์ฒด ์์ฑ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์์ ์๋ก์ด ES6
ํด๋์ค๋ก ์ ํํ๋ ๊ฒ์ ์ด๋ ต์ง ์์์ผํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ํจ์์ฒ๋ผ, class
๋ ์ ์ธ์ด๋ ํํ์์ ์ํด ์ ์ ๋ ์ ์์ต๋๋ค.
Essential Reading: Learn React from Scratch! (2019 Edition)
Class Declarations
ํด๋์ค ์ ์ธ์ class
ํค์๋๋ก ์ ์๋๊ณ ํด๋์ค์ ์ด๋ฆ์ด ๋ค๋ฐ๋ฆ
๋๋ค.
class Animal {}
์ฐ๋ฆฌ๋ ์ด๋ฏธ Animal
์์ฑ์ ํจ์์ ES6
๋ฒ์ ์ ์์ฑํ ๋ class
์ ์ธ์ ์ฌ์ฉํ์ต๋๋ค.
class Animal {
constructor(name, fierce){
this._name = name;
this._fierce = fierce;
}
}
Class Expressions
ํด๋์ค ํํ์์ ์ข ๋ ์ ์ฐ์ฑ์ ํ์ฉํฉ๋๋ค. ํด๋์ค์ ์ด๋ฆ์ด ์ง์ ๋๊ฑฐ๋ ์ด๋ฆ์ด ์ง์ ๋์ง ์์ ์๋ ์์ง๋ง ํด๋์ค ํํ์์ ์ด๋ฆ์ด ์ง์ ๋๋ฉด name ์์ฑ์ ํด๋์ค ๋ณธ๋ฌธ์ ๋ก์ปฌ ์์ฑ์ด๋๊ณ .name
์์ฑ์ ์ฌ์ฉํ์ฌ ์ก์ธ์ค ํ ์ ์์ต๋๋ค.
์ด๋ฆ์๋ ํด๋์ค ํํ์์ class
ํค์๋๋ฅผ ๋ฐ์ ์ด๋ฆ์ ๊ฑด๋๋ฐ๋ ๊ฒ์
๋๋ค.
// unnamed
let animal = class {}
๋ฐ๋ฉด์ ๋ช ๋ช ๋ ํด๋์ค ํํ์์ ์ด๋ฆ์ ํฌํจํฉ๋๋ค.
// named
let animal = class Animal {}
๊ฐ์ฒด ์์ฑ์๋ฅผ ES6 ํด๋์ค
์ ๋น๊ตํ ๋ ํธ์ด์คํธ๋ก ์ธํด ๋ฒ์๊ฐ ์ ์๋๊ธฐ ์ ์ ์ก์ธ์ค ํ ์์๋ ๊ฐ์ฒด ์์ฑ์์ ๋ฌ๋ฆฌ ํด๋์ค๋ ํธ์ด์คํธ๊ฐ ๋ ์์๊ณ ํธ์ด์คํธ๊ฐ ๋์ง ์์ต๋๋ค.
ES6 ํด๋์ค
์ ํฐ ํ๊ณ๋ก ๋ณด์ผ ์ ์์ง๋ง ๊ทธ๋ด ํ์๋ ์๋ค. ์ข์ ES6
์ฐ์ต์ ์ด๋ค ๊ธฐ๋ฅ์ด ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋ณ๊ฒฝํด์ผ ํ๋ค๋ฉด ํ๋ก๊ทธ๋จ ๋ด์ ์ด๋ ๊ณณ์์๋ ์ ์๋ ์ ์์ง๋ง, class
์์ฒด๊ฐ ์ ์๋ ํ์๋ง ํธ์ถ๋์ด์ผ ํ๋ค๊ณ ์๊ตฌํฉ๋๋ค.
Constructor and Body of a Class
๋ช ์๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ ์ค ํ๋๋ฅผ ์ฌ์ฉํ์ฌ ํด๋์ค๋ฅผ ์ ์ํ ํ ์ค๊ดํธ{}๋ ํด๋์ค ๋ณ์ (์ : ์ธ์คํด์ค ๋ณ์, ๋ฉ์๋ ๋๋ ์์ฑ์)๋ฅผ ๋ณด์ ํด์ผํฉ๋๋ค. ์ค๊ดํธ ์์์๋ ์ฝ๋๋ ํด๋์ค์ ๋ณธ๋ฌธ์ ๊ตฌ์ฑํฉ๋๋ค.
ํด๋์ค์ ์์ฑ์๋ ๋จ์ํ ๊ทธ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์ด๊ธฐํํ๋ ๊ฒ์ ๋ชฉ์ ์ผ๋กํ๋ ๋ฉ์๋์ ๋๋ค. ์ฆ, ํด๋์ค์ ์ธ์คํด์ค๊ฐ ์์ฑ ๋ ๋๋ง๋ค ํด๋์ค์ ์์ฑ์(์ ์ ๋ ๊ณณ)๊ฐ ํธ์ถ๋์ด ํด๋น ์ธ์คํด์ค์์ ์์ ์ ์ํํฉ๋๋ค. ์ ์๋ฅผ ์ฌ์ฉํ ์ ์์ ๋ ์์ ๋ ๋งค๊ฐ ๋ณ์ ๋๋ ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด์ ์์ฑ์ ์ด๊ธฐํ ํ ์ ์์ต๋๋ค.
ํ๋์ ์์ฑ์ ๋ฉ์๋๊ฐ ํด๋์ค์ ์ฐ๊ด ๋ ์ ์๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ ์์ฑ์ ๋ฉ์๋๋ฅผ ์ ์ํ์ง ์๋๋ก ์กฐ์ฌํด์ผํฉ๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก SyntaxError
๊ฐ ๋ฐ์ํฉ๋๋ค. super
ํค์๋๋ ๊ฐ์ฒด์ ์์ฑ์ ๋ด์์ superclass
์ ์์ฑ์๋ฅผ ํธ์ถํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
class Animal {
constructor(name, fierce){ // there can only be one constructor method
this._name = name;
this._fierce = fierce;
}
}
ํด๋์ค ๋ณธ๋ฌธ ๋ด์ ์ฝ๋๋ ์๊ฒฉ ๋ชจ๋์์ ์คํ๋ฉ๋๋ค.
Defining Methods
ํด๋์ค์ ๋ณธ๋ฌธ์ ์ผ๋ฐ์ ์ผ๋ก ํด๋์ค์ ์ธ์คํด์ค์ ์ํ๋ฅผ ์ ์ํ๋ ์ธ์คํด์ค ๋ณ์์ ํด๋น ํด๋์ค์ ์ธ์คํด์ค์ ๋์์ ์ ์ํ๋ ํ๋กํ ํ์
๋ฐฉ๋ฒ์ ํฌํจํฉ๋๋ค. ES6
์ด์ ์ ์์ฑ์ ํจ์์ ๋ํ ๋ฐฉ๋ฒ์ ์ ์ํด์ผ ํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ดํ ์ ์์ต๋๋ค.
function Animal (name, fierce) {
Object.defineProperty(this, 'name', {
get: function() { return name; }
});
Object.defineProperty(this, 'fierce', {
get: function() { return fierce; }
});
}
Animal.prototype.toString = function() {
return 'A' + ' ' + ( this.fierce ? 'fierce' : 'tame' ) + ' ' + this.name;
}
ํน์
function Animal (name, fierce) {
Object.defineProperty(this, 'name', {
get: function() { return name; }
});
Object.defineProperty(this, 'fierce', {
get: function() { return fierce; }
});
this.toString = function() {
return 'A' + ' ' + ( this.fierce ? 'fierce' : 'tame' ) + ' ' + this.name;
}
}
์์ ์ ์ํ ๋ ๊ฐ์ง ๋ฉ์๋๋ฅผ ํ๋กํ ํ์ ๋ฉ์๋๋ผ๊ณ ํ๋ฉฐ ํด๋์ค์ ์ธ์คํด์ค์์ ํธ์ถ ํ ์ ์์ต๋๋ค. ES6์์๋ ํ๋กํ ํ์ ๊ณผ Static๋ฉ์๋์ ๋ ๊ฐ์ง ์ ํ์ ์ ์ ํ ์ ์์ต๋๋ค. ES6์์ ํ๋กํ ํ์ ๋ฉ์๋๋ฅผ ์ ์ํ๋ ๊ฒ์ ๊ตฌ๋ฌธ์ด ๋ ๊นจ๋ํ๊ณ (ํ๋กํ ํ์ ์์ฑ์ ํฌํจํ์ง ์์) ๋ ์ฝ๊ธฐ ์ฝ๋ค๋ ์ ์ ์ ์ธํ๊ณ ๋ ์์์ ์ค๋ช ํ ๊ฒ๊ณผ ๋งค์ฐ ์ ์ฌํฉ๋๋ค.
class Animal {
constructor(name, fierce){
this._name = name;
this._fierce = fierce;
}
get name() {
return this._name;
}
get fierce() {
return ` This animal is ${ this._fierce ? 'fierce' : 'tame' }`;
}
toString() {
return `This is a ${ this._fierce ? 'fierce' : 'tame' } ${this._name}`;
}
}
์ฌ๊ธฐ์์๋ ๋ ์งง์ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ๋ ๊ฐ์ getter ๋ฉ์๋๋ฅผ ์ ์ํ ๋ค์ ๊ธฐ๋ณธ์ ์ผ๋ก Animal
ํด๋์ค์ ์ธ์คํด์ค๊ฐ ์ผ์์ด๊ฑฐ๋ ๊ธธ๋ค์ธ ๋๋ฌผ์ธ์ง ์ฌ๋ถ๋ฅผ ํ์ธํ๋ toString
๋ฉ์๋๋ฅผ ์์ฑํฉ๋๋ค. ์ด ๋ฉ์๋๋ Animal
ํด๋์ค์ ๋ชจ๋ ์ธ์คํด์ค์์ ํธ์ถ ํ ์ ์์ง๋ง ํด๋์ค ์์ฒด์์๋ ํธ์ถ ํ ์ ์์ต๋๋ค.
ES6
ํ๋กํ ํ์
๋ฉ์๋๋ ์์ ํด๋์ค์์ ์์๋ฐ์ ์๋ฐ์คํฌ๋ฆฝํธ์์ ๊ฐ์ฒด์งํฅ์ ํ๋์ ์๋ฎฌ๋ ์ด์
ํ ์ ์์ง๋ง ํ๋์์๋ ์์ ๊ธฐ๋ฅ์ด ๊ธฐ์กด ํ๋กํ ํ์
์ฒด์ธ์ ๊ธฐ๋ฅ ์ผ ๋ฟ์ด๋ฉฐ ๊ณง ์ดํด ๋ณด๊ฒ ์ต๋๋ค.
๋ชจ๋ `ES6`๋ฉ์๋๋ ์์ฑ์๋ก ์๋ ํ ์ ์์ผ๋ฉฐ `new`ํค์๋๋ก ํธ์ถ ๋ ๊ฒฝ์ฐ `TypeError`๋ฅผ ๋ฐ์์ํต๋๋ค.
Static Methods
Static ๋ฉ์๋๋ ํธ์ถ ๋์์ ํ๋์ ์ ์ํ์ง๋ง ํด๋์ค์ ์ธ์คํด์ค์ ์ํด ํธ์ถ ๋ ์ ์๊ธฐ ๋๋ฌธ์ ํ๋กํ ํ์ ๋์ ๋ฌผ๊ณผ ๋ค๋ฅด๋ค๋ ์ ์์ ํ๋กํ ํ์ ๋ฐฉ๋ฒ๊ณผ ์ ์ฌํฉ๋๋ค. Static ๋ฉ์๋๋ ํด๋์ค์์๋ง ํธ์ถํ ์ ์์ต๋๋ค. ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ์ฌ Static ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ค๋ ์๋๋ ์์์น ๋ชปํ ํ๋์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
Static ๋ฉ์๋๋ static ํค์๋๋ก ์ ์ํด์ผํฉ๋๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ Static ๋ฉ์๋๋ ํด๋์ค์ ์ ํธ๋ฆฌํฐ ํจ์๋ก ์ฌ์ฉ๋ฉ๋๋ค.
๋๋ฌผ ๋ฆฌ์คํธ๋ฅผ ๋ฐํํ๋ Animal ํด๋์ค์ Static ์ ํธ๋ฆฌํฐ ๋ฉ์๋๋ฅผ ์ ์ ํด ๋ด ์๋ค :
class Animal {
constructor(name, fierce){
this._name = name;
this._fierce = fierce;
}
static animalExamples() {
return `Some examples of animals are Lion, Elephant, Sheep, Rhinocerus etc`
}
}
์ด์ ํด๋์ค ์์ฒด์์ animalExamples() ๋ฉ์๋๋ฅผ ํธ์ถ ํ ์ ์์ต๋๋ค.
console.log(Animal.animalExamples()); // "Some examples of animals are Lion, Elephant, Sheep, Rhinocerus etc"
Subclassing in ES6
๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์์๋ ์ผ๋ฐ์ ์ธ ๋ฉ์๋์ ์์ฑ์ ๊ฐ์ง ๊ธฐ๋ณธ ํด๋์ค๋ฅผ ๋ง๋ค๊ณ , ๊ธฐ๋ณธ ํด๋์ค ๋ฑ์์ ์ด๋ฌํ ์ผ๋ฐ์ ์ธ ๋ฉ์๋๋ฅผ ์์ํ๋ ๋ค๋ฅธ ํน์ ํด๋์ค๋ฅผ ๋ง๋๋ ๊ฒ์ด ์ข์ต๋๋ค. ES5์์๋ ํ๋กํ ํ์ ์ฒด์ธ์ ์ฌ์ฉํ์ฌ ์ด๋ฌํ ๋์์ ์๋ฎฌ๋ ์ด์ ํ์ผ๋ฉฐ ๊ตฌ๋ฌธ์ ๋๋ก๋ ์ง์ ๋ถํด์ง ์ ์์ต๋๋ค.
ES6๋ ์์์ ์ฝ๊ฒ ํ๋ ๋ค์ ์ต์ํ extends
ํค์๋๋ฅผ ๋์
ํ์ต๋๋ค. ํ์ ํด๋์ค๋ ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ณธ ํด๋์ค์ ์์ฑ์ ์ฝ๊ฒ ์์ํ ์ ์์ต๋๋ค.
class Animal {
constructor(name, fierce){
this._name = name;
this._fierce = fierce;
}
get name() {
return this._name;
}
get fierce() {
return ` This animal is ${ this._fierce ? 'fierce' : 'tame' }`;
}
toString() {
return `This is a ${ this._fierce ? 'fierce' : 'tame' } ${this._name}`;
}
}
class Felidae extends Animal {
constructor(name, fierce, family){
super(name, fierce);
this._family = family;
}
family() {
return `A ${this._name} is an animal of the ${this._family} subfamily under the ${Felidae.name} family`;
}
}
์ฐ๋ฆฌ๋ Felidae(๋๊ฐ ๊ณ ์์ด๋ผ๊ณ ํจ) ํ์ ํด๋์ค๋ฅผ ๋ง๋ค๊ณ Animal ํด๋์ค์ ๋ฉ์๋๋ฅผ ์์ํฉ๋๋ค. superํด๋์ค(๊ธฐ๋ณธ ํด๋์ค) ์์ฑ์๋ฅผ ํธ์ถํ๊ธฐ ์ํด Felidae
ํด๋์ค์ ์์ฑ์ ๋ฉ์๋์์ super
ํค์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค. Felidae
ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค๊ณ ๋ฉ์๋์ ์์ ๋ ๋ฉ์๋๋ฅผ ํธ์ถํด ๋ด
์๋ค.
var Tiger = new Felidae('Tiger', true, 'Pantherinae');
console.log(Tiger.toString()); // "This is a fierce Tiger"
console.log(Tiger.family()); // "A Tiger is an animal of the Pantherinae subfamily under the Felidae family"
์์ฑ์๊ฐ ํ์ ํด๋์ค ๋ด์ ์์ผ๋ฉด "this"๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์ `super()`๋ฅผ ํธ์ถํด์ผํฉ๋๋ค.
ํจ์๋ฅผ ๊ธฐ๋ฐ์ผ๋กํ๋ "ํด๋์ค"๋ฅผ ํ์ฅํ๊ธฐ ์ํด `extends`ํค์๋๋ฅผ ์ฌ์ฉํ ์๋ ์์ง๋ง, ๊ฐ์ฒด ๋ฆฌํฐ๋ด๋ง์ผ๋ก ์์ฑ ๋ ํด๋์ค๋ฅผ ํ์ฅํ๋ ค๊ณ ์๋ํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ด ๊ธฐ์ฌ์ ์์ ๋ถ๋ถ์์ ์ฐ๋ฆฌ๋ ES6์ ์๋ก์ด ํค์๋์ ๋๋ถ๋ถ์ด ๊ธฐ์กด ํ๋กํ ํ์ ๊ธฐ๋ฐ ์์์ ๋ํ ๊ตฌ๋ฌธ์ ์คํ(syntactical sugar)์ด๋ผ๋ ๊ฒ์ ์์์ต๋๋ค. ์ํธ๋ฅผ๋ณด๊ณ ํ๋กํ ํ์ ์ฒด์ธ์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ์ดํด ๋ณด๊ฒ ์ต๋๋ค.
Prototypal Inheritance
์๋ก์ด 'ES6` ํค์๋๋ก ํด๋์ค๋ฅผ ์ ์ํ๊ณ ์์์ ์ํํ๋ ๊ฒ์ด ์ข์ง๋ง, ํ์ค ๋ ๋ฒจ์์ ์ด๋ป๊ฒ ์๋ํ๋์ง ์ดํดํ๋ ๊ฒ์ด ๋ ์ข์ต๋๋ค. ์๋ฐ ์คํฌ๋ฆฝํธ ๊ฐ์ฒด๋ฅผ ์ดํด ๋ด ์๋ค. ๋ชจ๋ ์๋ฐ ์คํฌ๋ฆฝํธ ๊ฐ์ฒด๋ ๋ ๋ฒ์งธ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ private ์์ฑ์ ๊ฐ์ต๋๋ค (์์ธ์ ์ผ๋ก ๋ ๋ฒ์งธ ๊ฐ์ฒด๋ 'null'์ ๊ฐ๋ฆฌํด).์ด ๋ ๋ฒ์งธ ๊ฐ์ฒด๋ 'ํ๋กํ ํ์ '์ด๋ผ๊ณ ํฉ๋๋ค.
์ฒซ ๋ฒ์งธ ๊ฐ์ฒด๋prototype
๊ฐ์ฒด์ ์์ฑ์ ์์ ๋ฐ๊ณ ํ๋กํ ํ์
์ ์์ฒด ํ๋กํ ํ์
์ ์ผ๋ถ ์์ฑ์ ์์๋ฐ์ ์ ์์ผ๋ฉฐ ์ฒด์ธ์ ๋ง์ง๋ง ํ๋กํ ํ์
์ ์์ฑ์ด'null'์ด ๋ ๋๊น์ง ๊ณ์ ์งํ๋ฉ๋๋ค.
๊ฐ์ฒด ๋ฆฌํฐ๋ด์ ๊ฐ์ ์๋ณ์๋ก ํ ๋นํ์ฌ ์์ฑ ๋ ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ์ฒด๋ ๋์ผํ ํ๋กํ ํ์ ๊ฐ์ฒด๋ฅผ ๊ณต์ ํฉ๋๋ค. ์ฆ, ํ๋กํ ํ์ ์ฒด์ธ์์ ๋์ผํ ํ๋กํ ํ์ ์์ฑ์ด ๋์ผํ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๊ณ ํด๋น ์์ฑ์ ์์๋ฐ์ต๋๋ค. ์ด ๊ฐ์ฒด๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋์์ 'Object.prototype`์ผ๋ก ์ฐธ์กฐ ๋ ์ ์์ต๋๋ค.
ํด๋์ค์ ์์ฑ์ ๋๋ ์์ฑ์ ํจ์๋ฅผ ํธ์ถํ์ฌ ์์ฑ ๋ ๊ฐ์ฒด๋ ์์ฑ์ ํจ์์ ํ๋กํ ํ์
์์ฑ์์ ํ๋กํ ํ์
์ ์ด๊ธฐํํฉ๋๋ค. ์ฆ, new object()๋ฅผ ํธ์ถํ์ฌ ์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๋ฉด ํด๋น ๊ฐ์ฒด์ ํ๋กํ ํ์
์ ๊ฐ์ฒด ๋ฆฌํฐ๋ด์์ ๋ง๋ ๊ฐ์ฒด์ ๋ง์ฐฌ๊ฐ์ง๋ก Object.prototype์ด๋ฉ๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก, new Date()
๊ฐ์ฒด๋ Date.prototype()
๊ณผ Number.prototype()
์ new Number()
๋ฅผ ์์๋ฐ์ต๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์ ๊ฑฐ์ ๋ชจ๋ ๊ฐ์ฒด๋ ํ๋กํ ํ์
์ฒด์ธ์ ์๋จ์ ์๋ ๊ฐ์ฒด์ ์ธ์คํด์ค์
๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ๊ฐ์ฒด(ํ๋กํ ํ์
)๋ก๋ถํฐ ์์ฑ์ ์์๋ฐ๋ ๊ฒ์ ์ ์์ด์ง๋ง, Object.prototype
์ ํ๋กํ ํ์
์ด ์๊ณ ๋ค๋ฅธ ๊ฐ์ฒด๋ก๋ถํฐ ์์ฑ(ํ๋กํ ํ์
์ฒด์ธ ์๋จ์ ์์)์ ์์๋ฐ์ง ์๋ ๋๋ฌธ ํ๋์ ๋ณด์ธ๋ค.
๊ฑฐ์ ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ด์ฅ ์์ฑ์๋Object.prototype
์์ ์์๋๋ฏ๋กNumber.prototype
์Object.prototype
์ ์์ฑ์ ์์ํ๋ค๊ณ ๋งํ ์ ์์ต๋๋ค. ์ด ๊ด๊ณ์ ํจ๊ณผ๋ ( 'new Number ()'๋ฅผ ์ฌ์ฉํ์ฌ) ์๋ฐ ์คํฌ๋ฆฝํธ์์Number
์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ฉดNumber.prototype
๊ณผObject.prototype
์์ ํ๋กํผํฐ๋ฅผ ์์๋ฐ์ ๊ฒ์ด๊ณ ํ๋กํ ํ์
์ฒด์ธ์ด๋ฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด๋ ์ ์ ๋ ์์ฑ์ ๋ณด์ ํ๊ณ ์์ผ๋ฏ๋ก ์ด๋ฌํ ์์ฑ์ "์์ฒด ์์ฑ(own property)"์ด๋ผ๊ณ ๋ถ๋ฅด์ง๋ง ์์ฒด ์์ฑ์๋ง ๊ตญํ๋์ง ์์ผ๋ฏ๋ก ์ปจํ ์ด๋๋ก ๊ฐ์ฃผ ํ ์ ์์ต๋๋ค. ํ๋กํ ํ์ ์ฒด์ธ์ ๊ฐ์ฒด๋ฅผ ๋์์ผ๋ก ์์ฑ์ ๊ฒ์ ํ ๋ ํฐ ์ญํ ์ํฉ๋๋ค.
- ์ด ์์ฑ์ ๋จผ์ ๊ฐ์ฒด์์ ์์ฒด ์์ฑ(own property)์ผ๋ก ๊ฒ์๋ฉ๋๋ค.
- ๊ฐ์ฒด์ ์์ฑ์ด ์์ผ๋ฉด ํ๋กํ ํ์ ์ด ๋ค์์ผ๋ก ๊ฒ์ฌ๋ฉ๋๋ค.
- ์์ฑ์ด ํ๋กํ ํ์ ์ ์์ผ๋ฉด ํ๋กํ ํ์ ์ ํ๋กํ ํ์ ์ด ์ฟผ๋ฆฌ๋ฉ๋๋ค.
- ํ๋กํ ํ์ ์ดํ์ ํ๋กํ ํ์ ์ฟผ๋ฆฌ๋ ์์ฑ์ด ๋ฐ๊ฒฌ๋๊ฑฐ๋ ํ๋กํ ํ์ ์ฒด์ธ์ ๋์ ๋๋ฌํ์ฌ ์ค๋ฅ๊ฐ ๋ฐํ ๋ ๋๊น์ง ๊ณ์๋ฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์์ ํ๋กํ ํ์ ์์์ ๋์์ ๋ช ํํ๊ฒ ์๋ฎฌ๋ ์ดํธํ๊ธฐ ์ํ ์ฝ๋๋ฅผ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค.
์ด ์์ ์์๋ ES5
๋ฉ์๋ Object.create()
๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ์ ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
Object.create()๋ ์ฒซ ๋ฒ์งธ ์ธ์๋ฅผ ํด๋น ๊ฐ์ฒด์ ํ๋กํ ํ์ ์ผ๋ก ์ฌ์ฉํ์ฌ ์ ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ๋ฉ์๋์ ๋๋ค.
let Animals = {}; // Animal inherits object methods from Object.prototype.
Animals.eat = true; // Animal has an own property - eat ( all Animals eat ).
let Cat = Object.create(Animals); // Cat inherits properties from Animal and Object.prototype.
Cat.sound = true; // Cat has it's own property - sound ( the animals under the cat family make sounds).
let Lion = Object.create(Cat); // Lion ( a prestigious cat ) inherits properties from Cat, Animal, and Object.prototype.
Lion.roar = true; // Lion has its own property - roar ( Lions can raw )
console.log(Lion.roar); // true - This is an "own property".
console.log(Lion.sound); // true - Lion inherits sound from the Cat object.
console.log(Lion.eat); // true - Lion inherits eat from the Animal object.
console.log(Lion.toString()); // "[object Object]" - Lion inherits toString method from Object.prototype.
์ฐ๋ฆฌ๊ฐ ์์์ ํ ๊ฒ์ ๋ํ ๊ตฌ์ ์ ์ธ ํด์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ฐ๋ฆฌ๋
Animals
๊ฐ์ฒด๋ฅผ ๋ง๋ค์๊ณObject.prototype
์ ์์ฑ์ ์์๋ฐ์ต๋๋ค. - ์ฐ๋ฆฌ๋
Animals
own property์ -eat-์ true๋ก ์ค์ ํ์ต๋๋ค (๋ชจ๋ ๋๋ฌผ์ด ๋จน์ต๋๋ค) - Cat์ด๋ผ๋ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ Animals์ ํ๋กํ ํ์
์ ์ด๊ธฐํ ํ์ต๋๋ค.(๊ทธ๋ฌ๋ฏ๋ก Cat์
Animals
๊ณผObject.prototype
์ ์์ฑ์ ์์๋ฐ์ต๋๋ค) - ์ฐ๋ฆฌ๋
Cat
own property์ -sound-๋ฅผ true๋ก ์ด๊ธฐํ ํ์ต๋๋ค (๊ณ ์์ด ๊ฐ์กฑ ์๋์ ๋๋ฌผ์ ์๋ฆฌ๋ฅผ๋ ๋๋ค) - Lion์ด๋ผ๋ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด Cat์ ํ๋กํ ํ์
์ ์ด๊ธฐํ ํ์ต๋๋ค (๋ฐ๋ผ์ Lion์
Cat
,Animal
๋ฐObject.prototype
์ ์์ฑ์ ์์๋ฐ์ต๋๋ค). - ์ฐ๋ฆฌ๋
Lion
own property์ -roar-์ true๋ก ์ด๊ธฐํ ํ์ต๋๋ค (๋ผ์ด์ธ์ ์ผ๋ฅด๋ ํฉ๋๋ค.) - ๋ง์ง๋ง์ผ๋ก
Lion
๊ฐ์ฒด์ ์์ ์ ์์ฑ๊ณผ ์์ ๋ ์์ฑ์ ๊ธฐ๋กํ์ผ๋ฉฐ,Lion
๊ฐ์ฒด์ ์์ฑ์ ๋จผ์ ์ฐพ์ ๋ค์ ๊ฐ์ฒด๊ฐ ์๋ ํ๋กํ ํ์ (ํ๋กํ ํ์ ์ ํ๋กํ ํ์ )์ผ๋ก ์ด๋ํ์ฌ ์ฌ๋ฐ๋ฅธ ๊ฐ์ ๋ฐํํ์ผ๋ฉฐ ์ ์์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
ํ๋กํ ํ์ ์ฒด์ธ์ ์ฌ์ฉํ๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ํ๋กํ ํ์ ์์์ ๋ํ ๊ธฐ๋ณธ์ด์ง๋ง ์ ํํ ์๋ฎฌ๋ ์ด์ ์ ๋๋ค.
Summing Up
์ด ๊ธ์์ ์ฐ๋ฆฌ๋ ES6 ํด๋์ค์ ํ๋กํ ํ์ ์์์ ๊ธฐ๋ณธ์ ์ดํด๋ณด์์ต๋๋ค. ๊ธฐ์ฌ๋ฅผ ์ฝ์ผ๋ฉด์ ํ๋ ๊ฐ์ง๋ฅผ ๋ฐฐ์ ์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค. ์ง๋ฌธ์ด ์์ผ๋ฉด ์๋ ๋๊ธ ์น์ ์ ๋จ๊ฒจ์ฃผ์ธ์.
์ด ๊ธฐ์ฌ์ฒ๋ผ?? ํธ์ํฐ์์ @neoighodaro๋ฅผ ํ๋ก์ฐํ์ธ์.