์ฑ <๋ฌ๋์๋ฐ์คํฌ๋ฆฝํธ>๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ๋ฐฐ์ด ์๋ฐ์คํฌ๋ฆฝํธ ๋ด์ฉ์ ๋๋ค.
๋ชฉ์ฐจ
- <๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ(OOP)>
1. ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ ์ฉ์ด
2. ์๋ฐ์คํฌ๋ฆฝํธ์ ์ธ์ด์ ํน์ง - <์๋ฐ์คํฌ๋ฆฝํธ์ OOP>
1. ๊ฐ์ฒด ์์ฑ
2. ํด๋์ค(ES5 vs ES6) ์์ฑ
3. ์ธ์คํด์ค ์์ฑ
4. construnctor(์์ฑ์)
5. ํ๋กํ ํ์ ์ฒด์ธ๊ณผ ๋ฉ์๋ ์ ์
6. ์์ - ์์ฌ ํด๋์ค ํจํด ์์, ํ๋กํ ํ์ ํจํด ์์
7. ์บก์ํ, ์ถ์ํ, ๋คํ์ฑ
<๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ(OOP)>
1. ์๋ฐ์คํฌ๋ฆฝํธ์ ์ธ์ด์ ํน์ง
- ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ฉํฐ-ํจ๋ฌ๋ค์ ์ธ์ด๋ก ๋ช ๋ นํ(imperative), ํจ์ํ(functional), ํ๋กํ ํ์ ๊ธฐ๋ฐ(prototype-based) ๊ฐ์ฒด์งํฅ ์ธ์ด์ด๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ด๋ฏธ ์์ฑ๋ ์ธ์คํด์ค์ ์๋ฃ๊ตฌ์กฐ์ ๊ธฐ๋ฅ์ ๋์ ์ผ๋ก ๋ณ๊ฒฝํ ์ ์๋ค๋ ํน์ง์ด ์๋ค. ๊ฐ์ฒด ์งํฅ์ ์์, ์บก์ํ(์ ๋ณด ์๋) ๋ฑ์ ๊ฐ๋ ์ ํ๋กํ ํ์ ์ฒด์ธ๊ณผ ํด๋ก์ ๋ฑ์ผ๋ก ๊ตฌํํ ์ ์๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ์์๋ ํจ์ ๊ฐ์ฒด๋ก ๋ง์ ๊ฒ์ ํ ์ ์๋๋ฐ ํด๋์ค, ์์ฑ์, ๋ฉ์๋๋ ๋ชจ๋ ํจ์๋ก ๊ตฌํ์ด ๊ฐ๋ฅํ๋ค.(ES6์์ ์๋กญ๊ฒ Class๊ฐ ๋์ ๋์์ง๋ง ์๋ก์ด ๊ฐ์ฒด์งํฅ ๋ชจ๋ธ์ ์ ๊ณตํ๋ ๊ฒ์ด ์๋๋ฉฐ, Class๋ ์ฌ์ค ํจ์์ด๊ณ ๊ธฐ์กด ํ๋กํ ํ์ ๊ธฐ๋ฐ์ด๋ค.)
- ์๋ฐ์คํฌ๋ฆฝํธ๋ ์์ฑ์ ํจ์์ new ์ฐ์ฐ์๋ฅผ ํตํด ์ธ์คํด์ค๋ฅผ ์์ฑํ ์ ์๋ค. ์ด๋ ์์ฑ์ ํจ์๋ ํด๋์ค์ด์ ์์ฑ์์ ์ญํ ์ ํ๋ค.
2. ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ ์ฉ์ด
- Class : ๊ฐ์ฒด์ ํน์ฑ์ ์ ์
- Object : Class์ ์ธ์คํด์ค
- Property : ๊ฐ์ฒด์ ํน์ฑ(์: ์๊น)
- Method : ๊ฐ์ฒด์ ๋ฅ๋ ฅ(์: ๊ฑท๊ธฐ)
- Constructor : ์ธ์คํด์คํ ๋๋ ์์ ์์ ํธ์ถ๋๋ ๋ฉ์๋
- Inheritance : ํด๋์ค๋ ๋ค๋ฅธ ํด๋์ค๋ก๋ถํฐ ํน์ฑ๋ค์ ์์๋ฐ์ ์ ์๋ค.
- Encapsulation : ํด๋์ค๋ ํด๋น ๊ฐ์ฒด์ ํน์ฑ๋ค๋ง์ ์ ์ํ ์ ์๊ณ , ๋ฉ์๋๋ ๊ทธ ๋ฉ์๋๊ฐ ์ด๋ป๊ฒ ์คํ๋๋์ง๋ง ์ ์ํ ์ ์๋ค. (์ธ๋ถ ์ ๊ทผ ๋ถ๊ฐ)
- Abstraction : ๋ณต์กํ ์์, ๋ฉ์๋, ๊ฐ์ฒด์ ์์ฑ์ ๊ฒฐํฉ์ ๋ฐ๋์ ํ์ค ์ธ๊ณ๋ฅผ ์๋ฎฌ๋ ์ด์
ํ ์ ์์ด์ผ ํ๋ค.
- Polymorphism : ๋ค๋ฅธ ํด๋์ค๋ค์ด ๊ฐ์ ๋ฉ์๋๋ ์์ฑ์ผ๋ก ์ ์๋ ์ ์๋ค.
<์๋ฐ์คํฌ๋ฆฝํธ์ OOP>
1. ๊ฐ์ฒด ์์ฑ
์๋ฐ์คํฌ๋ฆฝํธ๋ ํด๋์ค ๊ฐ๋ ์ด ์๊ณ ๋ณ๋์ ๊ฐ์ฒด ์์ฑ ๋ฐฉ๋ฒ์ด ์กด์ฌํ๋ค.
// ๊ฐ์ฒด ๋ฆฌํฐ๋ด
var obj1 = {};
obj1.name = 'Lee';
// Object() ์์ฑ์ ํจ์
var obj2 = new Object();
obj2.name = 'Lee';
// ์์ฑ์ ํจ์
function F() {}
var obj3 = new F();
obj3.name = 'Lee';
2. ํด๋์ค ์์ฑ
์๋ฐ์คํฌ๋ฆฝํธ(ํ๋กํ ํ์ ๊ธฐ๋ฐ ํ๋ก๊ทธ๋๋ฐ)๋ ํด๋์ค๊ฐ ํ์์๋(class-free) ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ ์คํ์ผ๋ก ํ๋กํ ํ์ ์ฒด์ธ๊ณผ ํด๋ก์ ๋ฑ์ผ๋ก ๊ฐ์ฒด ์งํฅ ์ธ์ด์ ์์, ์บก์ํ(์ ๋ณด ์๋) ๋ฑ์ ๊ฐ๋ ์ ๊ตฌํํ ์ ์๋ค.
2-1) ES5(ES6์ด์ ) - ์์ฑ์ ํจ์์ ํ๋กํ ํ์ , ํด๋ก์ ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ๊ตฌํํ์๋ค.
// ES5
var Person = (function () {
// Constructor
function Person(name) {
this._name = name;
}
// public method
Person.prototype.sayHi = function () {
console.log('Hi! ' + this._name);
};
// return constructor
return Person;
}());
var me = new Person('Lee');
me.sayHi(); // Hi! Lee.
console.log(me instanceof Person); // true
2-2) ES6 - ES6์์ class ๋ผ๋ ๋ฌธ๋ฒ์ด ์ถ๊ฐ ๋์ด,class ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ํ๋ค. ๊ธฐ์กด์ prototype ๊ธฐ๋ฐ์ผ๋ก ํด๋์ค๋ฅผ ๋ง๋๋ ๊ฒ๋ณด๋ค ๋ช ๋ฃํ๊ฒ ํด๋์ค๋ฅผ ๋ง๋ค ์ ์๊ฒ ๋์๋ค.
// ํด๋์ค ์ ์ธ๋ฌธ
class Person {
// constructor(์์ฑ์)
constructor(name) {
this._name = name;
}
sayHi() {
console.log(`Hi! ${this._name}`);
}
}
// ์ธ์คํด์ค ์์ฑ
const me = new Person('Lee');
me.sayHi(); // Hi! Lee
console.log(me instanceof Person); // true
โปํด๋์ค๋ ํด๋์ค ์ ์ธ๋ฌธ ์ด์ ์ ์ฐธ์กฐํ ์ ์๋ค. ํ์ง๋ง, ํธ์ด์คํ ์ด ๋ฐ์ํ์ง ์๋ ๊ฒ์ ์๋๋ค. ํด๋์ค๋ var ํค์๋๋ก ์ ์ธํ ๋ณ์์ฒ๋ผ ํธ์ด์คํ ๋์ง ์๊ณ , let, const ํค์๋๋ก ์ ์ธํ ๋ณ์์ฒ๋ผ ํธ์ด์คํ ๋๋ค. ๋ฐ๋ผ์ ํด๋์ค ์ ์ธ๋ฌธ ์ด์ ์ ์ผ์์ ์ผ๋ก ์ฌ๊ฐ์ง๋์ ๋น ์ง๊ธฐ ๋๋ฌธ์ ํธ์ด์คํ ์ด ๋ฐ์ํ์ง ์๋ ๊ฒ์ฒ๋ผ ๋์ํ๋ค.
3. ์ธ์คํด์ค ์์ฑ : new ์ฐ์ฐ์์ ํจ๊ป ํด๋์ค ์ด๋ฆ์ ํธ์ถํ๋ฉด ํด๋์ค์ ์ธ์คํด์ค๊ฐ ์์ฑ๋๋ค.
class Foo {}
const foo = new Foo();
// new ์ฐ์ฐ์์ ํจ๊ป ํธ์ถํ Foo๋ ํด๋์ค์ ์ด๋ฆ์ด ์๋๋ผ constructor(์์ฑ์)์ด๋ค.
// new ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ง ์๊ณ constructor๋ฅผ ํธ์ถํ๋ฉด TypeError๊ฐ ๋ฐ์ํ๋ค.
4. construnctor(์์ฑ์)
- ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ ํด๋์ค ํ๋๋ฅผ ์ด๊ธฐํํ๊ธฐ ์ํ ํน์ํ ๋ฉ์๋
- ์ธ์คํด์ค๋ฅผ ์์ฑํ ๋ new ์ฐ์ฐ์์ ํจ๊ป ํธ์ถํ ๊ฒ์ด ๋ฐ๋ก constructor์ด๋ฉฐ constructor์ ํ๋ผ๋ฏธํฐ์ ์ ๋ฌํ ๊ฐ์ ํด๋์ค ํ๋์ ํ ๋นํ๋ค.
- constructor๋ ํด๋์ค ๋ด์ ํ ๊ฐ๋ง ์กด์ฌํ๊ณ , 2๊ฐ ์ด์ ์กด์ฌํ๋ฉด SyntaxError ๋ฐ์ํ๋ค.
- constructor๋ ์๋ตํ ์ ์๋ค. constructor๋ฅผ ์๋ตํ๋ฉด ํด๋์ค์ constructor() {}๋ฅผ ํฌํจํ ๊ฒ๊ณผ ๋์ผํ๊ฒ ๋์ํ๋ค. ์ฆ, ๋น ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค. ๋ฐ๋ผ์ ์ธ์คํด์ค์ ํ๋กํผํฐ๋ฅผ ์ถ๊ฐํ๋ ค๋ฉด ์ธ์คํด์ค๋ฅผ ์์ฑํ ์ดํ, ํ๋กํผํฐ๋ฅผ ๋์ ์ผ๋ก ์ถ๊ฐํด์ผ ํ๋ค.
- constructor๋ ์ธ์คํด์ค์ ์์ฑ๊ณผ ๋์์ ํด๋์ค ํ๋์ ์์ฑ๊ณผ ์ด๊ธฐํ๋ฅผ ์คํํ๋ค. ๋ฐ๋ผ์ ํด๋์ค ํ๋๋ฅผ ์ด๊ธฐํํด์ผ ํ๋ค๋ฉด constructor๋ฅผ ์๋ตํด์๋ ์๋๋ค.
// ํด๋์ค ์ ์ธ๋ฌธ
class Person {
// constructor(์์ฑ์). ์ด๋ฆ์ ๋ฐ๊ฟ ์ ์๋ค.
constructor(name) {
// this๋ ํด๋์ค๊ฐ ์์ฑํ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
// _name์ ํด๋์ค ํ๋์ด๋ค.
this._name = name;
}
}
// ์ธ์คํด์ค ์์ฑ
const me = new Person('Lee');
console.log(me); // Person {_name: "Lee"}
5. ํ๋กํ ํ์ ์ฒด์ธ๊ณผ ๋ฉ์๋ ์ ์
- ๋ชจ๋ ๊ฐ์ฒด๋ ํ๋กํ ํ์ ์ด๋ผ๋ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ด๋ถ ๋งํฌ๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ์ฆ, ํ๋กํ ํ์ ์ ํตํด ์ง์ ๊ฐ์ฒด๋ฅผ ์ฐ๊ฒฐํ ์ ์๋๋ฐ ์ด๋ฅผ ํ๋กํ ํ์ ์ฒด์ธ์ด๋ผ ํ๋ค.
- ํ๋กํ ํ์ ์ ์ด์ฉํ์ฌ ์์ฑ์ ํจ์ ๋ด๋ถ์ ๋ฉ์๋๋ฅผ ์์ฑ์ ํจ์์ prototype ํ๋กํผํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ํ๋กํ ํ์ ๊ฐ์ฒด๋ก ์ด๋์ํค๋ฉด ์์ฑ์ ํจ์์ ์ํด ์์ฑ๋ ๋ชจ๋ ์ธ์คํด์ค๋ ํ๋กํ ํ์ ์ฒด์ธ์ ํตํด ํ๋กํ ํ์ ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ์ฐธ์กฐํ ์ ์๋ค.
function Person(name) {
this.name = name;
}
// ํ๋กํ ํ์
๊ฐ์ฒด์ ๋ฉ์๋ ์ ์
Person.prototype.setName = function (name) {
this.name = name;
};
// ํ๋กํ ํ์
๊ฐ์ฒด์ ๋ฉ์๋ ์ ์
Person.prototype.getName = function () {
return this.name;
};
var me = new Person('Lee');
var you = new Person('Kim');
var him = new Person('choi');
console.log(Person.prototype);
// Person { setName: [Function], getName: [Function] }
console.log(me); // Person { name: 'Lee' }
console.log(you); // Person { name: 'Kim' }
console.log(him); // Person { name: 'choi' }
6. ์์(Inheritance)
์๋ฐ์คํฌ๋ฆฝํธ์ ์์ ๊ตฌํ ๋ฐฉ์์ ํฌ๊ฒ ๋ ๊ฐ์ง๋ก ๊ตฌ๋ถํ ์ ์๋ค.
6-1) ์์ฌ ํด๋์ค ํจํด ์์(Pseudo-classical Inheritance) - ํด๋์ค ๊ธฐ๋ฐ ์ธ์ด์ ์์ ๋ฐฉ์์ ํ๋ด ๋ด๋ ๊ฒ
์์ฌ ํด๋์ค ํจํด์ ์์ ์์ฑ์ ํจ์์ prototype ํ๋กํผํฐ๋ฅผ ๋ถ๋ชจ ์์ฑ์ ํจ์์ ์ธ์คํด์ค๋ก ๊ต์ฒดํ์ฌ ์์์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ด๋ค. ๋ถ๋ชจ์ ์์ ๋ชจ๋ ์์ฑ์ ํจ์๋ฅผ ์ ์ํ์ฌ์ผ ํ๋ค.
Child ์์ฑ์ ํจ์๊ฐ ์์ฑํ ์ธ์คํด์ค child(โ )์ ํ๋กํ ํ์ ๊ฐ์ฒด๋ Parent ์์ฑ์ ํจ์๊ฐ ์์ฑํ ์ธ์คํด์ค(โก)์ด๋ค. ๊ทธ๋ฆฌ๊ณ Parent ์์ฑ์ ํจ์๊ฐ ์์ฑํ ์ธ์คํด์ค์ ํ๋กํ ํ์ ๊ฐ์ฒด๋ Parent.prototype์ด๋ค.
child๋ ํ๋กํ ํ์ ์ฒด์ธ์ ์ํด Parent ์์ฑ์ ํจ์๊ฐ ์์ฑํ ์ธ์คํด์ค์ Parent.prototype์ ๋ชจ๋ ํ๋กํผํฐ์ ์ ๊ทผํ ์ ์๋ค.
// ๋ถ๋ชจ ์์ฑ์ ํจ์
var Parent = (function () {
// Constructor
function Parent(name) {
this.name = name;
}
// method
Parent.prototype.sayHi = function () {
console.log('Hi! ' + this.name);
};
// return constructor
return Parent;
}());
// ์์ ์์ฑ์ ํจ์
var Child = (function () {
// Constructor
function Child(name) {
this.name = name;
}
// ์์ ์์ฑ์ ํจ์์ ํ๋กํ ํ์
๊ฐ์ฒด๋ฅผ ๋ถ๋ชจ ์์ฑ์ ํจ์์ ์ธ์คํด์ค๋ก ๊ต์ฒด.
Child.prototype = new Parent(); // โก
// ๋ฉ์๋ ์ค๋ฒ๋ผ์ด๋
Child.prototype.sayHi = function () {
console.log('์๋
ํ์ธ์! ' + this.name);
};
// sayBye ๋ฉ์๋๋ Parent ์์ฑ์ํจ์์ ์ธ์คํด์ค์ ์์น๋๋ค
Child.prototype.sayBye = function () {
console.log('์๋
ํ๊ฐ์ธ์! ' + this.name);
};
// return constructor
return Child;
}());
var child = new Child('child'); // โ
console.log(child); // Parent { name: 'child' }
console.log(Child.prototype); // Parent { name: undefined, sayHi: [Function], sayBye: [Function] }
child.sayHi(); // ์๋
ํ์ธ์! child
child.sayBye(); // ์๋
ํ๊ฐ์ธ์! child
console.log(child instanceof Parent); // true
console.log(child instanceof Child); // true
โป ์์ฌ ํด๋์ค ํจํด์ ๋ฌธ์ ์ (๊ตฌ๋ ์์ ๋ฌธ์ ๋ ์๋ค.)
new ์ฐ์ฐ์๋ฅผ ํตํด ์ธ์คํด์ค๋ฅผ ์์ฑ : ํ๋กํ ํ์ ๋ณธ์ฑ์ ๋ง๊ฒ ๊ฐ์ฒด์์ ๋ค๋ฅธ ๊ฐ์ฒด๋ก ์ง์ ์์ํ๋ ๋ฐฉ๋ฒ์ ๊ฐ๋ ๋์ ์์ฑ์ ํจ์์ new ์ฐ์ฐ์๋ฅผ ํตํด ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋ถํ์ํ ๊ฐ์ ์ ์ธ ๋จ๊ณ๊ฐ ์๋ค.
6-2) ํ๋กํ ํ์ ํจํด ์์(Prototypal Inheritance) - ํ๋กํ ํ์ ์ผ๋ก ์์์ ๊ตฌํํ๋ ๊ฒ
ํ๋กํ ํ์ ํจํด ์์์ Object.create ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด์์ ๋ค๋ฅธ ๊ฐ์ฒด๋ก ์ง์ ์์์ ๊ตฌํํ๋ ๋ฐฉ์์ด๋ค. ํ๋กํ ํ์ ํจํด ์์์ ๊ฐ๋ ์ ์ผ๋ก ์์ฌ ํด๋์ค ํจํด ์์๋ณด๋ค ๋ ๊ฐ๋จํ๋ค. ๋ํ ์์ฌ ํด๋์ค ํจํด์ ๋จ์ ์ธ new ์ฐ์ฐ์๊ฐ ํ์์์ผ๋ฉฐ, ์์ฑ์ ๋งํฌ๋ ํ๊ดด๋์ง ์์ผ๋ฉฐ, ๊ฐ์ฒด๋ฆฌํฐ๋ด์๋ ์ฌ์ฉํ ์ ์๋ค.
# ์์ฑ์ ํจ์๋ฅผ ์ฌ์ฉํ ํ๋กํ ํ์
ํจํด ์์
// ๋ถ๋ชจ ์์ฑ์ ํจ์
var Parent = (function () {
// Constructor
function Parent(name) {
this.name = name;
}
// method
Parent.prototype.sayHi = function () {
console.log('Hi! ' + this.name);
};
// return constructor
return Parent;
}());
// create ํจ์์ ์ธ์๋ ํ๋กํ ํ์
์ด๋ค.
var child = Object.create(Parent.prototype);
child.name = 'child';
child.sayHi(); // Hi! child
console.log(child instanceof Parent); // true
๊ฐ์ฒด๋ฆฌํฐ๋ด ํจํด์ผ๋ก ์์ฑํ ๊ฐ์ฒด์๋ ํ๋กํ ํ์ ํจํด ์์์ ์ฌ์ฉํ ์ ์๋ค.
var parent = {
name: 'parent',
sayHi: function() {
console.log('Hi! ' + this.name);
}
};
// create ํจ์์ ์ธ์๋ ๊ฐ์ฒด์ด๋ค.
var child = Object.create(parent);
child.name = 'child';
// var child = Object.create(parent, {name: {value: 'child'}});
parent.sayHi(); // Hi! parent
child.sayHi(); // Hi! child
console.log(parent.isPrototypeOf(child)); // true
7. ์บก์ํ, ์ถ์ํ, ๋คํ์ฑ
7-1) ์บก์ํ(Encapsulation)
์บก์ํ๋ ๊ด๋ จ์๋ ๋ฉค๋ฒ ๋ณ์์ ๋ฉ์๋๋ฅผ ํด๋์ค์ ๊ฐ์ ํ๋์ ํ ์์ ๋ด๊ณ ์ธ๋ถ์ ๊ณต๊ฐ๋ ํ์๊ฐ ์๋ ์ ๋ณด๋ ์จ๊ธฐ๋ ๊ฒ์ ๋งํ๋ฉฐ ๋ค๋ฅธ ๋ง๋ก ์ ๋ณด ์๋(information hiding)์ด๋ผ๊ณ ํ๋ค.
var Person = function(arg) {
var name = arg ? arg : ''; // โ
this.getName = function() {
return name;
};
this.setName = function(arg) {
name = arg;
};
}
var me = new Person('Lee');
var name = me.getName();
console.log(name);
me.setName('Kim');
name = me.getName();
console.log(name);
โ ์ name ๋ณ์๋ private ๋ณ์๊ฐ ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๋ function-level scope๋ฅผ ์ ๊ณตํ๋ฏ๋ก ํจ์ ๋ด์ ๋ณ์๋ ์ธ๋ถ์์ ์ฐธ์กฐํ ์ ์๋ค. ๋ง์ฝ์ var ๋์ this๋ฅผ ์ฌ์ฉํ๋ฉด public ๋ฉค๋ฒ๊ฐ ๋๋ค. ๋จ new ํค์๋๋ก ๊ฐ์ฒด๋ฅผ ์์ฑํ์ง ์์ผ๋ฉด this๋ ์์ฑ๋ ๊ฐ์ฒด์ ๋ฐ์ธ๋ฉ๋์ง ์๊ณ ์ ์ญ๊ฐ์ฒด์ ์ฐ๊ฒฐ๋๋ค. ๊ทธ๋ฆฌ๊ณ public ๋ฉ์๋ getName, setName์ ํด๋ก์ ๋ก์ private ๋ณ์(์์ ๋ณ์)์ ์ ๊ทผํ ์ ์๋ค. ์ด๊ฒ์ด ๊ธฐ๋ณธ์ ์ธ ์ ๋ณด ์๋ ๋ฐฉ๋ฒ์ด๋ค.
7-2) ์ถ์ํ(Abstraction)
์ถ์ํ๋ ์์
๋ฌธ์ ์ ํ์ฌ ๋ถ๋ถ์ ๋ชจ๋ธ๋งํ ์ ์๋๋ก ํ๋ ๋งค์ปค๋์ฆ์ด๋ค. ์ถ์ํ๋ ์์(specialization, ์ถ์์ ์์ค์ ๋ฎ์ถ๋ ๊ฒ)๊ณผ ํฉ์ฑ์ผ๋ก ๊ตฌํํ ์ ์๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๋ ์์์ ์ํด ํน๋ณํ(specialization)๋ฅผ, ํด๋์ค๋ค์ ์ธ์คํด์ค๋ฅผ ๋ค๋ฅธ ๊ฐ์ฒด์ ์์ฑ๊ฐ์ด ๋๊ฒ ํจ์ผ๋ก์จ ํฉ์ฑ์ ๊ตฌํํ๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ Function ํด๋์ค๋ Object ํด๋์ค๋ฅผ ์์๋ฐ๊ณ (์ด๋ ๋ชจ๋ธ์ ํน๋ณํ๋ฅผ ๋ณด์ฌ์ค๋ค),
- Function.prototype ์์ฑ์ Object์ ์ธ์คํด์ค์ด๋ค(์ด๋ ํฉ์ฑ์ ๋ณด์ฌ์ค๋ค).
7-3) ๋คํ์ฑ(Polymorphism)
๋ชจ๋ ๋ฉ์๋์ ์์ฑ๋ค์ prototype ์์ฑ์ ์ ์ธ๋์ด ์๊ณ , ํด๋์ค๊ฐ ๋ค๋ฅด๋ค๋ฉด ๊ฐ์ ์ด๋ฆ์ ๋ฉ์๋๋ ์ ์ธํ ์ ์๋ค. ๋ฉ์๋๋ค์ ๋ฉ์๋๊ฐ ์ ์ธ๋ ํด๋์ค๋ก ๊ทธ ์คํ ์์ญ์ด ํ์ ๋๋ค. ๋ฌผ๋ก ์ด๊ฑด ๋ ๊ฐ์ ํด๋์ค๋ค์ด ์๋ก ๋ถ๋ชจ-์์ ๊ด๊ณ๊ฐ ์๋๋์๋ง ์ฑ๋ฆฝํ๋ค. ์ฆ ๋ค์ ๋งํด ๋ถ๋ชจ-์์ ๊ด๊ณ์ ์์ ๊ด๊ณ๋ก ํ๋๊ฐ ๋ค๋ฅธ ํ๋์๊ฒ์ ์์๋ฐ์ง ์์์ ๋์๋ง ์ฑ๋ฆฝํ๋ค.
'๐ฐ ์ธ์ด > JS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ES6์ ์ฌ๋ณผ, ์ดํฐ๋ ์ดํฐ์ ์ ๋ค๋ ์ดํฐ (0) | 2020.01.14 |
---|---|
map๊ณผ set (0) | 2020.01.10 |
๊ฐ์ฒด ์งํฅ ์ธ์ด - ํ๋กํ ํ์ ๊ธฐ๋ฐ ์ธ์ด(JS) (0) | 2020.01.04 |
๋ฐฐ์ด๊ณผ ๋ฐฐ์ด์ฒ๋ฆฌ (0) | 2020.01.03 |
์ค์ฝํ(2) (0) | 2019.12.22 |