Search
Duplicate

ν”„λ‘œν† νƒ€μž…

ν”„λ‘œν† νƒ€μž…

1.
μ™œ ν”„λ‘œν† νƒ€μž…μ„ λ°°μš°λŠ”κ°€
2.
ν”„λ‘œν† νƒ€μž… μ •μ˜
3.
ν”„λ‘œν† νƒ€μž…κ³Ό 객체 생성
4.
ν”„λ‘œν† νƒ€μž… 체인
5.
ν”„λ‘œν† νƒ€μž… 상속
6.
ES6 class와 ν”„λ‘œν† νƒ€μž…
7.
전체 μš”μ•½

μžλ°”μŠ€ν¬λ¦½νŠΈ ν”„λ‘œν† νƒ€μž…

μ™œ ν”„λ‘œν† νƒ€μž…μ„ λ°°μš°λŠ”κ°€?

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” C++, Java처럼 β€œν΄λž˜μŠ€ κΈ°λ°˜β€ μ–Έμ–΄κ°€ μ•„λ‹ˆλΌ, ν”„λ‘œν† νƒ€μž… 기반 언어이닀.
즉, 객체가 μ–΄λ–€ ν‹€(Class)λ‘œλΆ€ν„° μƒμ„±λ˜λŠ” 것이 μ•„λ‹ˆλΌ, λ‹€λ₯Έ 객체λ₯Ό μžμ‹ μ˜ λΆ€λͺ¨μ²˜λŸΌ μ‚ΌλŠ” λ°©μ‹μœΌλ‘œ κΈ°λŠ₯을 μƒμ†ν•œλ‹€.
ES6μ—μ„œ class 문법이 생기긴 ν–ˆμ§€λ§Œ, λ‚΄λΆ€μ μœΌλ‘œλŠ” μ—¬μ „νžˆ ν”„λ‘œν† νƒ€μž… 기반 ꡬ쑰둜 μž‘λ™ν•œλ‹€.
λ”°λΌμ„œ ν”„λ‘œν† νƒ€μž…μ„ μ΄ν•΄ν•˜λ©΄:
β€’
객체가 μ–΄λ–»κ²Œ κΈ°λŠ₯을 κ³΅μœ ν•˜λŠ”μ§€
β€’
λ©”λͺ¨λ¦¬κ°€ μ–΄λ–»κ²Œ μ ˆμ•½λ˜λŠ”μ§€
β€’
class 문법이 μ‹€μ œλ‘œ λ‚΄λΆ€μ—μ„œ 무엇을 ν•˜λŠ”μ§€
λ₯Ό μ •ν™•ν•˜κ²Œ 이해할 수 μžˆλ‹€.

ν”„λ‘œν† νƒ€μž… μ •μ˜

β€œκ°μ²΄μ˜ μ›ν˜•β€
ν”„λ‘œν† νƒ€μž…(Prototype)은 객체듀이 κ³΅ν†΅μ μœΌλ‘œ μ‚¬μš©ν•˜λŠ” μ›ν˜•(λΆ€λͺ¨ 객체)을 μ˜λ―Έν•œλ‹€.
μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ κ°μ²΄λŠ” 생성될 λ•Œ μžλ™μœΌλ‘œ νŠΉμ • ν”„λ‘œν† νƒ€μž…κ³Ό μ—°κ²°λœλ‹€.
이 ν”„λ‘œν† νƒ€μž…μ—λŠ” 곡톡 λ©”μ„œλ“œλ‚˜ 속성을 μ €μž₯해두고, λͺ¨λ“  κ°μ²΄λŠ” 이λ₯Ό κ³΅μœ ν•œλ‹€.

예제

function Person(name) { this.name = name; } Person.prototype.sayHello = function () { console.log(`μ•ˆλ…•ν•˜μ„Έμš”, μ €λŠ” ${this.name}μž…λ‹ˆλ‹€.`); }; const p1 = new Person("홍길동"); p1.sayHello();
JavaScript
볡사

μ„€λͺ…

β€’
Person.prototype 은 β€œPerson 객체의 μ›ν˜•β€
β€’
sayHello λŠ” λͺ¨λ“  Person μΈμŠ€ν„΄μŠ€κ°€ 곡유
β€’
p1 객체에 sayHelloκ°€ μ—†μ§€λ§Œ, λΆ€λͺ¨μΈ Person.prototypeμ—μ„œ μ°Ύμ•„ μ‹€ν–‰ν•œλ‹€
ν”„λ‘œν† νƒ€μž…μ€ 마치 β€œμ—¬λŸ¬ 객체가 ν•¨κ»˜ μ‚¬μš©ν•˜λŠ” 곡톡 κ΅κ³Όμ„œβ€μ™€ κ°™λ‹€.

ν”„λ‘œν† νƒ€μž…κ³Ό 객체 생성

객체λ₯Ό 생성할 λ•Œ ν”„λ‘œν† νƒ€μž…μ€ μžλ™μœΌλ‘œ μ—°κ²°λœλ‹€.
특히 μƒμ„±μž ν•¨μˆ˜μ™€ new μ—°μ‚°μžλ‘œ 생성할 λ•Œ λ‹€μŒ 과정을 κ±°μΉœλ‹€.

예제

function Person(name) { this.name = name; } const p1 = new Person("철수");
JavaScript
볡사

λ‚΄λΆ€ λ™μž‘ μ„€λͺ…

new Person("철수") λŠ” μ•„λž˜ μˆœμ„œλ₯Ό κ±°μΉœλ‹€.
1.
μƒˆλ‘œμš΄ 빈 객체 {} 생성
2.
μƒˆ 객체의 __proto__ κ°€ Person.prototype 으둜 μ—°κ²°
3.
Person ν•¨μˆ˜ μ‹€ν–‰, this에 ν”„λ‘œνΌν‹° μ €μž₯
4.
μ™„μ„±λœ 객체 λ°˜ν™˜
즉 λ‹€μŒμ΄ 항상 μ„±λ¦½ν•œλ‹€:
p1.__proto__ === Person.prototype // true
JavaScript
볡사
μ΄λ ‡κ²Œ κ°μ²΄λŠ” μžμ‹ μ΄ μ‚¬μš©ν•  "λΆ€λͺ¨" μ—­ν• μ˜ ν”„λ‘œν† νƒ€μž…κ³Ό μ—°κ²°λœλ‹€.

ν”„λ‘œν† νƒ€μž… 체인

κ°μ²΄μ—μ„œ μ†μ„±μ΄λ‚˜ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λ €κ³  ν•  λ•Œ, μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” λ‹€μŒ μˆœμ„œλ‘œ νƒμƒ‰ν•œλ‹€.
1.
obj μžμ²΄μ—μ„œ methodλ₯Ό μ°Ύκ³ 
2.
μ—†μœΌλ©΄ obj의 __proto__ (ν”„λ‘œν† νƒ€μž…)μ—μ„œ μ°Ύκ³ 
3.
κ·Έλž˜λ„ μ—†μœΌλ©΄ κ·Έ μƒμœ„ ν”„λ‘œν† νƒ€μž…μ—μ„œ 계속 νƒμƒ‰ν•©λ‹ˆλ‹€.
이 μ—°κ²°λœ 탐색 경둜λ₯Ό ν”„λ‘œν† νƒ€μž… 체인(Prototype Chain)이라고 ν•œλ‹€.

예제

const obj = { a: 1 }; console.log(obj.toString());
JavaScript
볡사

μ„€λͺ…

β€’
objμ—λŠ” toString이 μ—†λ‹€
β€’
κ·Έλž˜μ„œ obj.proto β†’ Object.prototype μ—μ„œ toString을 μ°ΎλŠ”λ‹€
β€’
Object.prototype도 μ—†λ‹€λ©΄ nullκΉŒμ§€ 탐색
β€’
nullμ—μ„œ λλ‚˜λ„λ‘ μ„€κ³„λ˜μ–΄ μžˆλ‹€
즉, 체인은 λ‹€μŒκ³Ό κ°™λ‹€:
obj β†’ Object.prototype β†’ null
Plain Text
볡사

ν”„λ‘œν† νƒ€μž… 상속

ν”„λ‘œν† νƒ€μž…μ„ μ΄μš©ν•˜λ©΄ 객체 κ°„ 상속도 κ°€λŠ₯ν•˜λ‹€.
ν•˜μœ„ 객체가 μƒμœ„ 객체의 κΈ°λŠ₯을 κ·ΈλŒ€λ‘œ λ¬Όλ €λ°›κ²Œ ν•˜λŠ” 것이닀.
μ•„λž˜λŠ” Dog이 Animal의 κΈ°λŠ₯을 μƒμ†ν•˜λŠ” μ˜ˆμ‹œμ΄λ‹€.

예제

function Animal(name) { this.name = name; } Animal.prototype.move = function () { console.log(this.name + " 이(κ°€) μ›€μ§μž…λ‹ˆλ‹€."); }; function Dog(name) { Animal.call(this, name); // Animal μƒμ„±μž μ‹€ν–‰ } // ν”„λ‘œν† νƒ€μž… 상속 μ„€μ • Dog.prototype = Object.create(Animal.prototype); Dog.prototype.constructor = Dog; Dog.prototype.bark = function () { console.log(this.name + " 멍멍!"); }; const d = new Dog("바둑이"); d.move(); // μƒμ†λœ κΈ°λŠ₯ d.bark(); // Dog 고유 κΈ°λŠ₯
JavaScript
볡사

μ„€λͺ…

β€’
Object.create(Animal.prototype)
β†’ Dog.prototype 의 λΆ€λͺ¨λ₯Ό Animal.prototype으둜 μ„€μ •
β€’
Dog μΈμŠ€ν„΄μŠ€λŠ” Animal의 λ©”μ„œλ“œλ₯Ό κ·ΈλŒ€λ‘œ μ‚¬μš©ν•  수 μžˆλ‹€
β€’
μ΄λ ‡κ²Œ κΈ°λŠ₯을 κ³΅μœ ν•˜κ³  ν™•μž₯ν•˜λŠ” ꡬ쑰가 β€œν”„λ‘œν† νƒ€μž… 상속”

ES6 ν΄λž˜μŠ€μ™€ ν”„λ‘œν† νƒ€μž…μ˜ 관계

ES6μ—μ„œ class 문법이 μΆ”κ°€λμ§€λ§Œ, λ‚΄λΆ€ λ™μž‘μ€ ν”„λ‘œν† νƒ€μž…μ„ μ΄μš©ν•œλ‹€.
μ•„λž˜ class μ½”λ“œλŠ”:
class Person { constructor(name) { this.name = name; } sayHello() { console.log(`μ•ˆλ…•ν•˜μ„Έμš”! ${this.name}`); } }
JavaScript
볡사
사싀 λ‚΄λΆ€μ μœΌλ‘œ λ‹€μŒκ³Ό 같은 ꡬ쑰둜 λ³€ν™˜λœλ‹€:
function Person(name) { this.name = name; } Person.prototype.sayHello = function () { console.log(`μ•ˆλ…•ν•˜μ„Έμš”! ${this.name}`); };
JavaScript
볡사
즉, classλŠ” 단지 ν”„λ‘œν† νƒ€μž…μ„ μ‰½κ²Œ 쓰도둝 ν•˜λŠ” 문법적 섀탕일 뿐이닀.

전체 핡심 μš”μ•½

주제
핡심 μš”μ•½
ν”„λ‘œν† νƒ€μž… μ •μ˜
객체듀이 κ³΅μœ ν•˜λŠ” μ›ν˜•(λΆ€λͺ¨ 객체)
객체 생성과 ν”„λ‘œν† νƒ€μž…
new μ—°μ‚° μ‹œ 객체의 __proto__κ°€ μƒμ„±μž.prototype에 μ—°κ²°
ν”„λ‘œν† νƒ€μž… 체인
객체 β†’ ν”„λ‘œν† νƒ€μž… β†’ Object.prototype β†’ null 순으둜 속성 탐색
ν”„λ‘œν† νƒ€μž… 상속
ν•œ μƒμ„±μžμ˜ prototype을 λ‹€λ₯Έ prototypeκ³Ό μ—°κ²°ν•΄ κΈ°λŠ₯을 상속
class와 ν”„λ‘œν† νƒ€μž…
classλŠ” ν”„λ‘œν† νƒ€μž… 기반 μƒμ†μ˜ 문법적 νŽΈμ˜λ²„μ „