λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

JavaScript

[Javascript] ν”„λ‘œν† νƒ€μž… (Prototype)

졜근 이전에 κ³΅λΆ€ν–ˆλ˜ λ‚΄μš©μ΄ 잘 기얡이 λ‚˜μ§€ μ•ŠμŒμ„ κΉ¨λ‹«κ³  μžλ°”μŠ€ν¬λ¦½νŠΈ κΈ°λ³Έ μ€‘μ˜ κΈ°λ³Έ ν”„λ‘œν† νƒ€μž…μ— λŒ€ν•΄μ„œ μž¬ν•™μŠ΅ν–ˆλ‹€.

 

🧐 ν”„λ‘œν† νƒ€μž…μ΄λž€?

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” ν”νžˆ μ‚¬μš©ν•˜λŠ” ν΄λž˜μŠ€κ°œλ…μ΄ ES6(2015)에 λ„μž…μ΄ λ˜μ—ˆλ‹€. κ·Έλ ‡λ‹€λ©΄ μ½”λ“œ μž¬μ‚¬μš©, μΊ‘μŠν™”λ₯Ό μ–΄λ–»κ²Œ ν–ˆμ„κΉŒ? μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” ν”„λ‘œν† νƒ€μž…μ„ 기반으둜 상속과 μΊ‘μŠν™”λ₯Ό 지원할 수 μžˆλ‹€.

 

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λͺ¨λ“  κ°μ²΄μ—λŠ” ν•΄λ‹Ή μƒμ„±μž ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μƒμ„±λœ μΈμŠ€ν„΄μŠ€μ˜ μƒμœ„ 역할을 ν•˜λŠ” 객체인 ν”„λ‘œν† νƒ€μž…μ΄ μ‘΄μž¬ν•œλ‹€. λ”°λΌμ„œ λͺ¨λ“  κ°μ²΄λŠ” [[Prototype]]μ΄λΌλŠ” 인터널 슬둯(internal slot)을 가지고 μžˆλ‹€. [[Prototype]]의 값은 null λ˜λŠ” 객체둜 ν”„λ‘œν† νƒ€μž… 체인을 μ΄μš©ν•΄ ν”„λ‘œν† νƒ€μž…μ˜ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.

 

λΈŒλΌμš°μ €μ—μ„œ 객체λ₯Ό 좜λ ₯해보면 λ‹€μŒκ³Ό 같은 λ‚΄μš©μ„ λ³Ό 수 μžˆλ‹€.

objλΌλŠ” 객체λ₯Ό κ°μ²΄λ¦¬ν„°λŸ΄μ„ 톡해 μƒμ„±ν•˜κ³  console.log()λ₯Ό 톡해 좜λ ₯ν–ˆλ‹€. λ‚΄λΆ€μ˜ 값을 보면 [[Prototype]]μ΄λΌλŠ” 것을 λ³Ό 수 μžˆλŠ”λ° μ΄λŠ” λ‚΄κ°€ μ„ μ–Έν•œ obj 객체의 ν”„λ‘œν† νƒ€μž…μ„ μ˜λ―Έν•œλ‹€. 객체 λ¦¬ν„°λŸ΄μ„ 톡해 μ„ μ–Έν–ˆμ§€λ§Œ λ‚΄λΆ€μ μœΌλ‘œ μƒμ„±μžν•¨μˆ˜λ₯Ό ν˜ΈμΆœν–ˆμœΌλ©°, ν˜ΈμΆœν•œ μƒμ„±μžν•¨μˆ˜λŠ” Object의 μƒμ„±μž ν•¨μˆ˜λ‘œ λ‚΄κ°€ μ„ μ–Έν•œ 객체의 ν”„λ‘œν† νƒ€μž…μ΄λ‹€.

 

객체가 μ•„λ‹Œ 배열을 ν†΅ν•œ μ˜ˆμ‹œλ₯Ό 확인해봀닀.

μ΄λ²ˆμ—λŠ” λ¦¬ν„°λŸ΄μ΄ μ•„λ‹Œ Array μƒμ„±μž ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄μ„œ arr에 ν• λ‹Ήν–ˆλ‹€. 좜λ ₯된 값을 μ‚΄νŽ΄λ³΄λ©΄ μ΄λ²ˆμ—λŠ” [[Prototype]]에 Arrayκ°€ μžˆλŠ” 것을 λ³Ό 수 μžˆλ‹€.

 

μ—¬κΈ°μ„œ ν•œλ²ˆ 더 생각해볼 수 μžˆλŠ” 것이 μžˆλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 배열은 μ‹€μ œλ‘œ 객체둜 κ΅¬ν˜„μ΄ λ˜μ–΄ μžˆλ‹€κ³  ν•œλ‹€. κ·Έλ ‡λ‹€λ©΄ λ°°μ—΄μ˜ ν”„λ‘œν† νƒ€μž…μ€ Objectκ°€ λ˜μ–΄μ•Ό ν•˜λŠ” 것이 μ•„λ‹κΉŒ?

λ§žλ‹€! Arrayλ₯Ό νŽΌμ³μ„œ μ‚΄νŽ΄λ³΄λ©΄ Array의 λ©”μ„œλ“œλ“€μ΄ μ­‰ λ‚˜μ—΄λ˜κ³  제일 μ•„λž˜μ— [[Prototype]]이 μžˆλŠ” 것을 λ³Ό 수 μžˆλŠ”λ° μ—¬κΈ°μ—λŠ” Objectκ°€ μžˆλŠ” 것을 확인 ν•  수 μžˆλ‹€.

 

μ΄λ ‡κ²Œ λͺ¨λ“  값듀은 ν”„λ‘œν† νƒ€μž…μ„ μ΄μš©ν•œλ‹€. κ·Έλ ‡λ‹€λ©΄ ν”„λ‘œν† νƒ€μž…μ„ ν™•μΈν•˜λŠ” 방법은 또 뭐가 μžˆμ„κΉŒ?

 

__proto__λΌλŠ” ν”„λ‘œνΌν‹°λ₯Ό μ΄μš©ν•΄ 확인할 수 μžˆλ‹€. __proto__ ν”„λ‘œνΌν‹°μ— μ ‘κ·Όν•˜λ©΄ λ‚΄λΆ€μ μœΌλ‘œ Object.getPrototypeOfκ°€ ν˜ΈμΆœλ˜μ–΄ ν”„λ‘œν† νƒ€μž… κ°μ²΄λ₯Ό λ°˜ν™˜ν•œλ‹€.

μœ„μ—μ„œ arr.__proto__λ₯Ό μ΄μš©ν•΄ μ„ μ–Έν–ˆλ˜ arr의 ν”„λ‘œν† νƒ€μž… 객체λ₯Ό 확인해봀닀. 이 κ°μ²΄λŠ” Array 객체이닀.

 

πŸ§‘πŸ»‍πŸ’» prototype을 μ΄μš©ν•˜λŠ” μ΄μœ λŠ” λ¬΄μ—‡μΌκΉŒ?

μœ„μ˜ μ˜ˆμ‹œμ²˜λŸΌ μƒμ„±μž ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄μ„œ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λ©΄ ν•΄λ‹Ή μΈμŠ€ν„΄μŠ€μ—λŠ” age, address, getInfoλΌλŠ” ν”„λ‘œνΌν‹° 및 λ©”μ„œλ“œλ₯Ό 가지고 μžˆλ‹€. μ΄λ•Œ μΈμŠ€ν„΄μŠ€λ₯Ό μ—¬λŸ¬κ°œ λ§Œλ“ λ‹€λ©΄ λΆˆν•„μš”ν•œ λ¦¬μ†ŒμŠ€λ₯Ό λ‚­λΉ„ν•˜κ²Œ λœλ‹€. μ™œλƒν•˜λ©΄ getInfoλ₯Ό 맀번 μƒμ„±ν•˜μ§€ μ•Šμ•„λ„ 됨에도 λΆˆκ΅¬ν•˜κ³  getInfoκ°€ 맀번 μƒμ„±λ˜κΈ° λ•Œλ¬Έμ΄λ‹€.

 

jbλ₯Ό 좜λ ₯해보면 age, address, getInfoκ°€ μ‘΄μž¬ν•˜λŠ” 것을 μ•Œ 수 μžˆλ‹€. 

 

prototype을 μ΄μš©ν•˜λ©΄ λ‹€μŒκ³Ό 같은 방법이 κ°€λŠ₯ν•˜λ‹€.

prototype을 μ΄μš©ν•΄ getInfoλ₯Ό μΆ”κ°€ν–ˆμ„ λ•Œ jbμ—λŠ” getInfo λ©”μ„œλ“œκ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€. ν•˜μ§€λ§Œ prototype의 λ©”μ„œλ“œμ— getInfoκ°€ μ‘΄μž¬ν•œλ‹€. 처음 Jongbin을 μ΄μš©ν•œ 방법은 맀번 getInfoλΌλŠ” ν•¨μˆ˜λ₯Ό λ©”λͺ¨λ¦¬μ— ν• λ‹Ήν•˜μ§€λ§Œ 두 번째둜 prototype을 μ΄μš©ν•œ 방법은 prototype의 λ©”μ„œλ“œλ‘œ λ“±λ‘λ˜μ–΄ 단 ν•œλ²ˆλ§Œ ν• λ‹Ήλœλ‹€.

 

이런 방법이 κ°€λŠ₯ν•œ μ΄μœ λŠ” ν”„λ‘œν† νƒ€μž… 체인 λ•Œλ¬Έμ΄λ‹€. ν”„λ‘œν† νƒ€μž… μ²΄μΈμ΄λž€ μš”κ΅¬ν•˜λŠ” 값이 μžμ‹ μ—κ²Œ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 경우 μƒμœ„ μš”μ†Œλ₯Ό νƒμƒ‰ν•˜λŠ” 것을 λ§ν•˜λŠ”λ° μœ„μ˜ κ²½μš°μ—λŠ” λ‹€μŒκ³Ό κ°™λ‹€.

jb μΈμŠ€ν„΄μŠ€μ—λŠ” getInfoκ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€ λ”°λΌμ„œ μƒμœ„μš”μ†ŒμΈ [[prototype]]을 ν™•μΈν•œλ‹€. Jongbin.prototypeμ—λŠ” getInfoλΌλŠ” λ©”μ„œλ“œκ°€ 있기 λ•Œλ¬Έμ— 이λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€. 

 

λ˜ν•œ μœ„μ—μ„œ 봀듯이 배열이 객체둜 이루어져 μžˆλ“―μ΄ ν•¨μˆ˜ λ˜ν•œ 객체둜 이루어져 μžˆλ‹€.  

jbμ—λŠ” toString()μ΄λΌλŠ” λ©”μ„œλ“œκ°€ μ—†μŒμ—λ„ λΆˆκ΅¬ν•˜κ³  μ •μƒμ μœΌλ‘œ λ™μž‘ν•œλ‹€. μ™œλƒν•˜λ©΄ μœ„μ˜ 그림에 덧뢙여 Jongbin.prototype의 μƒμœ„ ν”„λ‘œν† νƒ€μž…μœΌλ‘œ Objectκ°€ 있기 λ•Œλ¬Έμ΄λ‹€.

μ‹€μ œλ‘œ 좜λ ₯해보면 λ‹€μŒκ³Ό κ°™λ‹€.

 

μš°λ¦¬λŠ” 이런 ν”„λ‘œν† νƒ€μž…μ„ μ΄μš©ν•΄μ„œ 클래슀λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šλ”λΌλ„ 상속을 κ΅¬ν˜„ν•˜κ³  μ½”λ“œμ˜ μž¬μ‚¬μš©μ„ ν•  수 μžˆλ‹€!