์์๋๋ฉด ์ข์ Javascript
ํ์ด๋ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉฐ ๊ตฌํํ๊ณ ์ ํ๋ ๊ธฐ๋ฅ๋ค์ ๋๋ถ๋ถ Ajax ๋ฅผ ์ด์ฉํด์ ๊ตฌํํด์ผ ํ๋ค. ๊ทธ๋์ ์์ฐ์ค๋ Javascript๋ฅผ ์ ํ ๊ธฐํ๊ฐ ๋ง์๋๋ฐ, ์ด๋ฒ์ Node.js ๋ฅผ ๊ณต๋ถํ๋ฉฐ ๋๊ผ๋ค. ํ๋ก์ ํธ์์ ๋ง๋ Javascript๋ ์ฐ์ฃผ ๋จผ์ง๋ณด๋ค ์์ ์กด์ฌ๋ผ๋ ๊ฒ์..
Prototype ํบ์๋ณด๊ธฐ
- Prototype ์ Class ์ ๋ํ ๋ฌธ๋ฒ์ ๊ณต๋ถํ๊ธฐ ์ํด์ ํ์์ ์ผ๋ก ์์์ผ ํ๋ ๊ฐ๋
์ด๋ผ๊ณ ์๊ฐํ๋ค. ๋๋ ํด๋์ค ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๋ Java ๋ก ํ๋ก๊ทธ๋๋ฐ ๊ณต๋ถ๋ฅผ ์์ํด์ Javascript์ Class ๋ฌธ๋ฒ๋ ๊ธ๋ฐฉ ์ดํดํ ์ ์์ ์ค ์์๋๋ฐ ์ ํ ์๋์๋ค.
Javascript๋ ํ๋กํ ํ์ ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๋ ์ธ์ด๋ก์จ, Class ๋ฌธ๋ฒ์ ์ฌ์ฉํ ์ ์์ง๋ง ์ด๋ ๋ณด๊ธฐ์๋ง ํด๋์ค ๊ธฐ๋ฐ์ผ๋ก ์์ง์ด๋ ๊ฒ ์ฒ๋ผ ๋ณด์ด๊ฒ ํ๋ค. ์ฆ, ๊ฒ์ผ๋ก๋ ํด๋์ค ๊ธฐ๋ฐ์ธ ์ฒ ํ์ง๋ง ์์ผ๋ก๋ ํ๋กํ ํ์ ๊ธฐ๋ฐ์ผ๋ก ์์ง์ด๊ณ ์๋ค๋ ๋ง์ด๋ค.(๐ช๊ฒ๋ฐ์์ด ์ฌ์ง?)
๊ทธ๋ ๋ค๊ณ Protytpe๊ณผ Class๊ฐ ๋น์ทํ๋? ๊ทธ ๊ฒ๋ ์๋๋ค! ํ์ง๋ง ๋๊ฐ์ง ๊ฐ๋ ์ ๋ํด ์ถฉ๋ถํ ํท๊ฐ๋ฆด ์ ์๋ค.(๋ธ๋ก๊ทธ ์ฃผ์ธ์ฅ๊ป์ ๊ทธ๋ฌ๋ค.)
๊ทธ๋ ๊ธฐ์ ์์ ๋ ๊ฐ๋ ์ ๋ํ ์ฐจ์ด์ ์ ์ดํดํ๊ณ Class ๋ฌธ๋ฒ์ ์ฝ๊ฒ ์ดํดํ๊ธฐ ์ํด์ Prototype ์ ๋ํ ๊ฐ๋ ์ ์์์ผ ํ๊ณ , ์ด๋ฅผ ๋์ด Prototype-Object, Prototype-properties ๋ฑ ๋ค์ํ ๋ฌธ๋ฒ๊ณผ ์ด์ ๋ํ ๊ฐ๋ ์ ์ตํ์ผ ํ๋ค.
์ฐธ๊ณ ํ๋ฉด ์ข์ ๋ธ๋ก๊ทธ ๋งํฌ
[Javascript ] ํ๋กํ ํ์ ์ดํดํ๊ธฐ
Javascript ๊ธฐ์ด - Object prototype ์ดํดํ๊ธฐ
Prototype?
Javascript์์๋ Class๋ ์์ง๋ง(๊ฒ๋ฐ์์ด) ํจ์์ new ๋ฅผ ํตํด Class ์ฒ๋ผ ํํํ ์ ์๋ค.
// Dog ๋ผ๋ ํจ์๋ฅผ ๋ง๋ค๊ณ
// ํด๋น ํจ์๊ฐ eyes(๋), nose(์ฝ)๋ผ๋ ์์ฑ์ผ๋ก ๊ตฌ์ฑ๋์ด ์์์ ์ ์ธํ๋ค.
function Dog() {
this.eyes = 2;
this.nose = 1;
}
// ๋์ต์ด์ ๊ผฌ๋ง์ด๋ Dog ๋ผ๋ ํจ์๋ฅผ ํตํด ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ , Dog ๋ผ๋ ๊ฒ์ ๋ช
์ํ๋ค.
var ๋์ต์ด = new Dog();
var ๊ผฌ๋ง์ด = new Dog();
console.log(๋์ต์ด.eyes); // ๋์ต์ด์ ๋์ 2๊ฐ์ด๋ค. Dog ํจ์์ eyes ์์ฑ์ ์์๋ฐ๊ธฐ ๋๋ฌธ์ด๋ค.
console.log(๊ผฌ๋ง์ด.nose); // ๊ผฌ๋ง์ด์ ์ฝ๋ 1๊ฐ์ด๋ค. Dog ํจ์์ nose ์์ฑ์ ์์๋ฐ๊ธฐ ๋๋ฌธ์ด๋ค.
์์ ๊ฐ์ด ๋์ต์ด
์ ๊ผฌ๋ง์ด
๋ Dog
๋ผ๋ ํจ์๋ฅผ ํตํด ๊ฐ์ฒด๊ฐ ๋ง๋ค์ด์ง๋ฉฐ ์ด๋ eyes 2๊ฐ, nose 1๊ฐ๋ฅผ ๊ณตํต์ ์ผ๋ก ๊ฐ์ง๊ณ ์๋ค. ์ด๋ ๋ฉ๋ชจ๋ฆฌ์์ ๊ฐ ์์ฑ์ด Dog
ํจ์๋ฅผ ํตํด ๋ง๋ค์ด์ง ๊ฐ์ฒด์ ๊ฐ์๋งํผ ํ ๋น๋๋ค. ์ฆ, ๋์ต์ด
์ ๊ผฌ๋ง์ด
๊ฐ์ ๊ฐ์์ง๋ฅผ 1000๋ง๋ฆฌ๋ฅผ ๋ง๋ค๋ฉด 2000๊ฐ์ ๋ณ์๊ฐ ํ ๋น๋๋ค.
์ด์ ๊ฐ์ด ํน์ ํจ์๋ฅผ ํตํด ๋ง๋ค์ด์ง ๊ฐ์ฒด๊ฐ ๋ง๋ค์ด์ง ์๋ก ํ ๋นํด์ผ ํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ง์์ง๊ธฐ ๋๋ฌธ์ ๊ต์ฅํ ๋น ํจ์จ์ ์ด๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ฅผ Prototype ์ ํตํด ํด๊ฒฐํ ์ ์๋ค.
function Dog(){}
Dog.prototype.eyes = 2;
Dog.prototype.nose = 1;
var ๋์ต์ด = new Dog();
var ๊ผฌ๋ง์ด = new Dog();
console.log(๋์ต์ด.eyes);
console.log(๊ผฌ๋ง์ด.nose);
์์ ์ฝ๋์์ **Dog.prototype**
๋ ๋น์ด์๋ Object๋ก์ ๋ฉ๋ชจ๋ฆฌ ์ด๋๊ฐ์ ์กด์ฌํ๊ณ ์์ผ๋ฉฐ, Dog
ํจ์๋ก ๋ง๋ค์ด์ง ๊ฐ์ฒด ๋์ต์ด
์ ๊ผฌ๋ง์ด
๋ค์ ๋ฉ๋ชจ๋ฆฌ ์ด๋๊ฐ์ ์กด์ฌํ๋ Object์ ์๋ ๋ชจ๋ ์์ฑ์ ๊ฐ์ ์ฌ์ฉํ ์ ์๋ค.
์ฆ, Dog
ํจ์์ ์กด์ฌํ๋ eyes
์ nose
์์ฑ์ ๋ฉ๋ชจ๋ฆฌ ์ด๋๊ฐ์ ์ ์ฅํ๊ณ , ๋์ต์ด
์ ๊ผฌ๋ง์ด
๊ฐ Dog
ํจ์์ eyes
์ nose
์์ฑ์ ๊ณต์ ํ๋ค๋ ๋ป์ด๋ค.
์ฆ, ์ฒซ ๋ฒ์งธ ์ฝ๋์์ Dog
ํจ์๋ ํด๋น ํจ์ ๋ด์ ์์ฑ์ ๋ง๋ค์ด ํด๋น ํจ์๋ก ๋ง๋ค์ด์ง ๊ฐ์ฒด์ ํด๋น ํจ์์ ์์ฑ์ ํ ๋นํ๋ค. ๋ฐ๋ฉด ๋ ๋ฒ์งธ ์ฝ๋์์ Dog
ํจ์๋ ๊ป๋ฐ๊ธฐ๋ง ์์ ๋ฟ ์์ ํ
๋น์๋ค. ํ์ง๋ง **Object.prototype
** ์ด๋ผ๋ ์์ฑ์ ์ด์ฉํด ๋ฒ์ฉ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ๋๋ก(?) Dog
ํจ์์ ์์ฑ์ ์ ์ธํ์๋ค.
์ด๋ก์จ Dog
ํจ์๋ก ๋ง๋ค์ด์ง ๊ฐ์ฒด๊ฐ ๋ช ๊ฐ๊ฐ ๋๋ **Dog.prototype**
์ eyes
์ nose
์์ฑ์ ๊ณต์ ํ ์ ์๋ค.
Prototype Link? Prototype Object?
๋ธ๋ก๊ทธ์์๋ Javascript์ ๊ธฐ์ด๊ฐ ํํํ์ง ์์ ์ฌ๋๋ค์ด Prototype Link์ Prototype Object์ ๋ํด ๋ช
ํํ ์ฐจ์ด๋ฅผ ์ดํดํ๊ธฐ ์ด๋ ต๋ค๊ณ ๋งํ๋ค.(== ๋)
๊ทธ๋์ ์ด ๋์ด ๋๋์ฒด ๋ฌด์์ด๋ฉฐ ์ฐจ์ด๋ ๋ฌด์์ธ์ง ์์๋ณด๋ ค๊ณ ํ๋ค.
๋จผ์ Prototype Link ์ Prototype Obejct ๋ Prototype ์ด๋ผ๊ณ ํตํ์ด ๋ถ๋ฅธ๋ค.
Prototype Link๋ ๋ง์น Spring Framework ์ ํน์ง ์ค ํ๋์ธ Dependency(์ฃผ์
)์ ์ผ๋ถ๋ถ ๊ฐ์๋ค.(๊ต์ฅํ ์ฃผ๊ด์ ์ธ ์๊ฒฌ) ์๋ํ๋ฉด ๋ธ๋ก๊ทธ์ ์์ธํ ๋์ ์๋ ๊ทธ๋ฆผ์ ๋ณด๋ฉด ์๊ฒ ์ง๋ง ํน์ ํจ์๋ก ๋ง๋ค์ด์ง ๊ฐ์ฒด์ ์์ฑ์ด ์ ์ธ๋์ง ์์๋๋ฐ๋ proto ๋ผ๋ ์์ฑ(Prototype Property)์ ํตํด ์ฐธ์กฐํ๊ณ ์๋ ํจ์์ ์์ฑ์ ๊ฐ๋ฆฌํฌ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ํ, ํด๋น ์ด๋ฆ์์๋ ์ ์ ์๋ฏ Link ๋ผ๊ณ ๋๋๊ณ ๋งํ๊ณ ์๋ค. (Spring Framework ๋ฅผ ๊ณต๋ถํ ๋ Autowired ๋ฅผ ํตํด bean ์ผ๋ก ๋ฑ๋กํ์ฌ ๋์ด๋ค ์ฌ์ฉํ๋ ๊ฒ์ '๋งํฌ ๊ฑด๋ค' ๋ผ๊ณ ํํํ๋ ๊ธฐ์ต์ด ์๋ค.)
์ด๋ ๊ฒ ํน์ ๊ฐ์ฒด๊ฐ ์ฐธ์กฐํ๊ณ ์๋ ํจ์๋ฅผ proto ์์ฑ์ ํตํด ์์ฑ์ ๊ฐ๋ฆฌํค๋ ๊ฒ(์์ ํ๋กํ ํ์
๊ณผ ์ฐ๊ฒฐ๋์ด ์๋ ํํ)์ Prototype Chain ์ด๋ผ๊ณ ํ๋ค.
์ด๋ฅผ ๋ ๋ค๋ฅธ ๊ด์ ์ผ๋ก ์๊ฐํด๋ณด๋ฉด DOM ๊ณผ ๋น์ทํ๋ค๊ณ ๋งํ ์ ์์ ๊ฒ ๊ฐ๋ค.
Prototype Object๋ ๋ง ๊ทธ๋๋ก ์์์ ๊ฐ์ฒด๋ฅผ ๋ปํ๋ค. Javascript์์ ๋ชจ๋ ๊ฐ์ฒด๋ ํจ์๋ฅผ ํตํด ์์ฑ๋๋๋ฐ, Object, Function, Array ๋ฑ ์ด๋ฌํ ๊ฒ๋ค๋ ํจ์๋ก ์ ์๋์ด ์๋ค. ์ด๋ ๊ฒ ๊ฐ์ฒด๋ ๋ชจ๋ ํจ์๋ก ์์ฑ๋๋ค๋ ํน์ง์ ๋ฐํ์ผ๋ก ํจ์๊ฐ ์ ์ ๋ ๋๋ ๋ ๊ฐ์ง ํน์ง์ ๊ฐ์ง๋ค.
- ํด๋น ํจ์์ Constructor(์์ฑ์) ์๊ฒฉ ๋ถ์ฌ
- ์์ฑ์ ์๊ฒฉ์ด ๋ถ์ฌ๋๋ฉด new๋ฅผ ํตํด ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ ์๊ฒ ๋๋ค.
- ํด๋น ํจ์์ Prototype Object ์์ฑ ๋ฐ ์ฐ๊ฒฐ
- ์์ฑ์ ์๊ฒฉ์ ๋ถ์ฌํ๊ฒ ๋๋ฉด์ ๊ฐ์ฒด๊ฐ ๋ง๋ค์ด์ง ๋ ํจ๊ป ์์ฑ๋ ํจ์๋ฅผ ๊ฐ๋ฅดํค๊ณ ์๋ค.
์ด๋ฌํ ํน์ง์ ๊ฐ์ง Protype Object๋ ์ผ๋ฐ์ ์ธ ๊ฐ์ฒด๋ก ์์ฑ์ ์ ๋ง์ ๋ง๊ฒ ์ถ๊ฐ/์ญ์ ๊ฐ ๊ฐ๋ฅํ๋ค. ๋ํ Protype Object์ ํน์ง์ผ๋ก ์ธํด ํด๋น ํจ์๋ก ๋ง๋ค์ด์ง ๊ฐ์ฒด๋ ํด๋น ํจ์๋ฅผ ์ฐธ์กฐํ ์ ์๋ค.
Class ํบ์๋ณด๊ธฐ
์์ Prototype ๊ฐ๋ ์ ๋ํ ์ดํด๊ฐ ์กฐ๊ธ ๋์๋ค๋ฉด ์ด์ Class ๊ฐ๋ ์ ๋ํด ์ดํดํ ์ฐจ๋ก์ด๋ค.
// Human ํจ์ ์์ฑ
var Human = function(type) {
this.type = type || 'human';
}
Human.isHuman = function(human) {
return human instanceof Human;
}
// Human()์ ์ฐธ์กฐํ์ฌ ์์ฑ๋ ๊ฐ์ฒด์ ๋ถ์ฌํ ์์ฑ ์ ์ธ
Human.prototype.breathe = function() {
alert('h-a-a-a-m');
}
// Human()๋ฅผ ์ฐธ์กฐ๋ฐ์ ์๋ก์ด ๊ฐ์ฒด ์์ฑ
var sh = function(type, firstName, lastName) {
Human.apply(this.arguments);
this.firstName = firstName;
this.lastName = lastName;
}
// ์์์ Human() ํจ์๋ฅผ ์ฐธ์กฐ๋ฐ์ ๋ง๋ค์ด์ง ๊ฐ์ฒด์ ๊ธฐ๋ณธ ์์ฑ ์ค์
sh.prototype = Object.create(Human.prototype); // Human() ํจ์์ ์์ฑ์ ๋ถ๋ฌ์ ์ค์ ํ๋ค.
sh.prototype.constructor = sh; // ์์ฑ์๋ sh
sh.prototype.sayName = function() {
alert(this.firstName + ' ' + this.lastName);
} // sh ๊ฐ์ฒด์ sayName ์ด๋ผ๋ ํจ์๋ฅผ ์ถ๊ฐํ๋ค.
var oldSh = new sh('human','SeongHeon','Sim');
Human.isHuman(oldSh);
console.log(Human.isHuman(oldSh))
// ์์ ์ฝ๋์์ Human ์์ฑ์ ํจ์๊ฐ ์๊ณ , ๊ทธ ํจ์๋ฅผ Zero ์์ฑ์ ํจ์๊ฐ ์์ํ๋ค.
// Zero ์์ฑ์ ํจ์๋ฅผ ๋ณด๋ฉด ์์ก๋ฐ๊ธฐ ์ํ ์ฝ๋๊ฐ ์๋นํ ๋ํดํ๋ฐ, Human.apply ์ Object.create ๋ถ๋ถ์ด ์์๋ฐ์ผ๋ฉด์ ๋ณต์กํด์ก๋ค.
์์ ์ฝ๋์ ๊ฒฝ์ฐ Prototype ์ ์ด์ฉํด ์์์ ๊ตฌํํ๋ค. ํ์ง๋ง ๋์ ์ฒ์ ๋ณด๋ ์ฝ๋๊ฐ ๋๋ฌดํด์ ๊ฝค๋ ๋นํฉํ๋ค. ์์ ์ฝ๋๋ฅผ Class ๋ฌธ๋ฒ์ ์ ์ฉํ๋ฉด ์๋์ ์ฝ๋์ฒ๋ผ ๋ฐ๋๊ณ , ์ฝ๋๋ฅผ ํ์ธํด๋ณด๋ฉด ๊ฐ๋ ์ฑ์ด ๋ง์ด ์ข์์ก๋ค๋ ๊ฒ์ ๋๋ ์ ์๋ค. ์๋ํ๋ฉด Java์ ํด๋์ค ๊ตฌ์กฐ์ ๊ต์ฅํ ๋น์ทํ๊ธฐ ๋๋ฌธ์ด๋ค! ๋ค๋ง, Javascript์์ ์๋์ ์ฝ๋๊ฐ ํด๋์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์ ํ์ง๋ ์๋ ์ ์ ์ฐธ๊ณ ํด์ผ ํ๋ค.
// Class๋ฅผ ์ด์ฉํด ์์ ๊ฐ๋
์ดํดํ๊ธฐ
// ํด๋์ค ์ ์ธ
class Person{
// Person ํด๋์ค์ ์์ฑ์ ์ ์ธ
constructor(type = 'person'){
this.type = type;
}
// ์ ์ ๋ฉ์๋ ์์ฑ (์์ ์ฝ๋์์ Human.isHuman ๊ฐ์ ํด๋์ค ํจ์)
static isPerson(person) {
return person instanceof Person;
}
// ์จ์ฌ๋ ๋ฉ์๋ ์์ฑ
breathe() {
alert("ํ-์-์-์");
}
}
// Person ํด๋์ค๋ฅผ ์์๋ฐ๋ Ssh ํด๋์ค ์์ฑ
class Ssh extends Person {
// ์์๋ฐ์ Person ํด๋์ค์ ์์ฑ์๋ฅผ ๋ถ๋ฌ์ Ssh ์ธ์คํด์ค ๋ณ์๊ฐ ์ค์
constructor(type, firstName, lastName) {
super(type);
this.firstName = firstName;
this.lastName = lastName;
}
// Ssh ํด๋์ค์ sayName() ํจ์๋ฅผ ๋ง๋ค์ด,
// ํด๋น ํจ์์ Person ํด๋์ค์ breathe() ํจ์ ์ฝ์
sayName() {
super.breathe();
alert(`${this.firstName} ${this.lastName}`);
}
}
// newSsh ๊ฐ์ฒด๋ฅผ Ssh ํด๋์ค๋ฅผ ์ด์ฉํด ์์ฑ
const newSsh = new Ssh('person','SeongHeon', 'Sim');
Person.isPerson(newSsh);
'Programming > Node.js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Node.js ์ดํดํ๊ธฐ - ์ฑ๊ธ ์ค๋ ๋ (0) | 2020.09.27 |
---|---|
Node.js ์ดํดํ๊ธฐ - ์ด๋ฒคํธ ๊ธฐ๋ฐ ์์คํ (0) | 2020.09.26 |
Node.js ์ดํดํ๊ธฐ - ๋น๋๊ธฐ ๋ ผ ๋ธ๋กํน I/O ๋ชจ๋ธ์ ๋ํด (0) | 2020.09.26 |