개발 μ‹œλ‚˜λΈŒλ‘œ

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

youngdeok 2023. 4. 30. 14:41

ν”„λ‘œν† νƒ€μž…(prototype)μ΄λž€, 무언가 μ œν’ˆμ„ λ§Œλ“œλŠ” κ³Όμ •μ—μ„œ μ‹œν—˜μš©μœΌλ‘œ 미리 λ§Œλ“€μ–΄λ³΄λŠ” 물건을 μ˜λ―Έν•œλ‹€. μ μ ˆν•œ ν•œκ΅­μ–΄ ν‘œν˜„μ€ γ€ˆμ‹œμ œν’ˆγ€‰(試製品), ‘μ‹œν—˜κΈ°’, ‘μ΄ˆκΈ°ν˜•’, ‘μ‹œμž‘ν˜•’이닀.

μ‹œμ œν’ˆμ΄λΌκ³  ν•˜λ©΄ λŒ€κ°œ μ•„λž˜μ˜ 경우 쀑 ν•˜λ‚˜ λ˜λŠ” 2개 ν•­λͺ© 이상에 ν•΄λ‹Ήλ˜λŠ” μ œν’ˆμ„ κ°€λ₯΄ν‚¨λ‹€.

  1. μ˜€λ¦¬μ§€λ„, λ˜λŠ” 기반이 된 λͺ¨λΈ.
  2. λŒ€ν‘œμ μœΌλ‘œ μ œμ‹œν•  수 μžˆλŠ” μ˜ˆκ°€ λ˜λŠ” λͺ¨λΈ.
  3. μ’…λ₯˜μ˜ κΈ°μ΄ˆκ°€ λ˜λŠ” λͺ¨λΈ.
  4. μ•žμ„œ μ œμž‘λœ λͺ¨λΈ.

-wiki


c++κ³Ό 같은 μ–Έμ–΄λŠ” 클래슀λ₯Ό 기반으둜 객체λ₯Ό λ§Œλ“­λ‹ˆλ‹€.

κ·Έλ ‡λ‹€λ©΄ ν΄λž˜μŠ€λž€ λ¬΄μ—‡μΌκΉŒμš”?

객체 μ§€ν–₯기반 μ–Έμ–΄ 책듀을 보면 “λΆ•μ–΄λΉ΅ν‹€κ³Ό λΆ•μ–΄λΉ΅” μ΄λŸ°μ‹μœΌλ‘œ ν΄λž˜μŠ€λŠ” 틀에 μΈμŠ€ν„΄μŠ€λŠ” κ·Έ ν‹€μ—μ„œ λ§Œλ“€μ–΄μ§„ 물건으둜 λΉ—λŒ€μ–΄ ν‘œν˜„ν•˜λŠ” κ²½μš°κ°€ λ§ŽμŠ΅λ‹ˆλ‹€.

 

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μ™œ ν”„λ‘œν† νƒ€μž…μ„ μ„ νƒν–ˆμ„κΉŒ

 

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μ™œ ν”„λ‘œν† νƒ€μž…μ„ μ„ νƒν–ˆμ„κΉŒ

ν”„λ‘œν† νƒ€μž…μœΌλ‘œ κ²€μƒ‰ν•˜λ©΄ 으레 λ‚˜μ˜€λŠ” μ„œλ‘μ²˜λŸΌ μ € λ˜ν•œ μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό 처음 μ ‘ν–ˆμ„ λ•Œ κ°€μž₯ λ‹Ήν™©μŠ€λŸ¬μ› λ˜ 게 ν”„λ‘œν† νƒ€μž…μ΄μ—ˆμŠ΅λ‹ˆλ‹€.

medium.com

μœ„μ˜ 글을 보고 λ‚˜λ©΄ μš°λ¦¬κ°€ 기쑴에 λ°°μ› λ˜ κ°œλ…λ“€μ„ 더 λ‹¨λ‹¨ν•˜κ³  μ •ν™•ν•˜κ²Œ μ•Œ 수 μžˆλŠ”λ°, ν•œλ²ˆ ν’€μ–΄μ„œ μ„€λͺ…ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€.

ν”ŒλΌν†€κ³Ό 이데아

객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°μ€ μ‹€μ„Έκ³„μ˜ 싀체λ₯Ό μΈμ‹ν•˜λŠ” 철학적 사고λ₯Ό ν”„λ‘œκ·Έλž˜λ°μ— μ ‘λͺ©ν•˜λ €λŠ” μ‹œλ„μ—μ„œ λΆ€ν„° μ‹œμž‘ν•©λ‹ˆλ‹€.

  • 예λ₯Ό λ“€μ–΄ μ‚¬λžŒμ€ 이름, μ£Όμ†Œ, 성별 λ“± λ‹€μ–‘ν•œ 속성을 κ°–λŠ”λ° μ΄λ•Œ 속성 ꡬ체적으둜 ν‘œν˜„ν•˜λ©΄ νŠΉμ •ν•œ μ‚¬λžŒκ³Όμ˜ ꡬ별을 인식할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 객체 μ§€ν–₯을 κ³΅λΆ€ν•˜λ‹€λ³΄λ©΄ 이런 말을 많이 λ“€μ–΄ 보셨을 κ²λ‹ˆλ‹€. “κ³΅ν†΅λ˜λŠ” μš”μ†Œλ“€μ„ λ¬Άμ–΄ 좔상화해라” κ³΅ν†΅λœ μš”μ†Œλ“€μ„ 묢으면 μ€‘λ³΅λ˜λŠ” μ½”λ“œλ₯Ό 쀄일 수 있고 보기에도 쒋을 κ²λ‹ˆλ‹€.

μ„œμ–‘μ² ν•™μ€ 이뢄법적 세계관을 κ°–κ³  μžˆμŠ΅λ‹ˆλ‹€.

  • 영혼 / 윑체
  • 좔상적 / ꡬ체적
  • 이데아 / ν”„λž™ν‹°μŠ€

λˆˆμ•žμ— μ‹€μ œλ‘œ, ꡬ체적으둜 μ‘΄μž¬ν•˜λŠ” 사물이 μžˆλ‹€λ©΄ λ°˜λ“œμ‹œ κ·Έκ²ƒμ˜ 본질이 μ‘΄μž¬ν•œλ‹€λŠ” 것이 ν”ŒλΌν†€μ˜ μ£Όμž₯μž…λ‹ˆλ‹€.

 

의자λ₯Ό 예λ₯Ό 듀어보면 λ‹€μ–‘ν•œ μ˜μžλ“€μ˜ λͺ¨μŠ΅λ“€μ΄ 머리λ₯Ό μŠ€μ³μ§€λ‚˜κ°ˆ κ²λ‹ˆλ‹€. 바퀴가 λ‹¬λ¦°μ˜μž, 원λͺ©μ˜μž, 게이밍 체어 λ“±λ“± 말이죠.

μ΄λŸ¬ν•œ μˆ˜λ§Žμ€ μ˜μžκ°€ μ‹€μ œλ‘œ μ‘΄μž¬ν•œλ‹€λ©΄ λ°˜λ“œμ‹œ κ·Έ 본질적이고 좔상적인 ‘의자’λΌλŠ” 것이 μ‘΄μž¬ν•œλ‹€λŠ” κ²ƒμ΄μ§€μš”. μ΄λŸ¬ν•œ 본질 세계λ₯Ό 이데아(Idea) 라고 ν•©λ‹ˆλ‹€.

 

(말이 μ°Έ μ–΄λ ΅μ£ ?. μ‰½κ²Œ μš°λ¦¬κ°€ μ–΄λ–€ 물체λ₯Ό μƒκ°ν–ˆμ„ λ•Œ λ– μ˜€λ₯΄λŠ” λ¬΄μ—‡μΈκ°€λŠ” μΆ”μƒμ μœΌλ‘œ μ‘΄μž¬ν•˜λŠ” 것 이라고 μƒκ°ν•˜μ‹œλ©΄ 될 것 κ°™μŠ΅λ‹ˆλ‹€.)

 

μ΄λŸ¬ν•œ 사고방식이 ν”„λ‘œκ·Έλž˜λ° 언어에도 μžμ—°μŠ€λŸ½κ²Œ λ…Ήμ•„λ“€μ–΄ 생긴 μ–Έμ–΄κ°€ “클래슀 기반 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄”μž…λ‹ˆλ‹€.

λΆ„λ₯˜(Classification)

μ΄λŸ¬ν•œ ν”ŒλΌν†€μ˜ 이데아 이둠은 그의 제자 μ•„λ¦¬μŠ€ν† ν…”λ ˆμŠ€μ— μ˜ν•΄μ„œ ‘λΆ„λ₯˜(classification)'λž€ κ°œλ…μœΌλ‘œ μ •λ¦½λ©λ‹ˆλ‹€. class λΌλŠ” ν‚€μ›Œλ“œκ°€ μ–΄λ””μ„œ λ‚˜μ˜¨ μ§€ μ•Œ 수 있겠죠?

(이 λŒ€λͺ©μ—μ„œ μ €λŠ” 정말 감동?! λ°›μ•˜μŠ΅λ‹ˆλ‹€. μ΄λ ‡κ²Œ ν΄λž˜μŠ€λΌλŠ” 것이 생긴 κ²ƒμ΄κ΅¬λ‚˜ ν•˜κ΅¬μš”!)

  • μ•„κΉŒ 처음 μ˜ˆμ‹œλ₯Ό 좔상화 μ˜ˆμ‹œλ₯Ό λ“œλ Έλ˜ “μ‚¬λžŒ”κ°μ²΄μ—μ„œ “μ‚¬λžŒ”μ΄λΌλŠ” ν‚€μ›Œλ“œλ‘œ “μ‚¬λžŒ”객체의 μš”μ†Œλ“€μ„ μ •ν•˜μ—¬ λΆ„λ₯˜ ν•œ 것이죠. 이해가 λ˜μ‹œλ‚˜μš”?

κ·Έλž˜μ„œ ν”„λ‘œν† νƒ€μž…μ€ 뭔데?

μœ„μ˜ κΈ€μ—μ„œλŠ” κ²Œμž„κ³Ό 본인이 일을 ν•  λ•Œ λŠλΌμ…¨λ˜ 것을 μ˜ˆμ‹œλ‘œ λ“œμ…¨λŠ”λ°, μ €λŠ” 곡감이 잘 μ•ˆλΌμ„œ….

μ •μΉ˜λ‘œ 예λ₯Ό λ“€μ–΄ λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

“우파” “쒌파”λΌλŠ” 말 λ“€μ–΄ 보셨죠???? μš°λ¦¬λŠ” μ™Όμͺ½ 였λ₯Έμͺ½ 이뢄법적인 κ΄€μ μœΌλ‘œ μ •μΉ˜μ  견해λ₯Ό ν‘œν˜„ν•˜κ³€ ν•©λ‹ˆλ‹€. 그런데 κ·Έ 쀑간에 μ„œμžˆλŠ” μ‚¬λžŒμ€ 없을 κΉŒμš”????. λ‹Ήμ—°νžˆ 있겠죠?

 

이게 classification의 μ•½μ μž…λ‹ˆλ‹€. 세상은 κ²°μ½” 2κ°€μ§€λ‘œ λ‚˜λˆ  질 수 μ—†κΈ° λ•Œλ¬Έμ΄μ£ .

 

이처럼 2κ°€μ§€λ‘œ λ‚˜λˆŒ 수 없을 κ²½μš°λŠ” μ–΄λ–»κ²Œ ν•΄μ•Ό ν• κΉŒμš”??? μ΄λ•Œ λ“±μž₯ν•œ 것이 μ§€κΈˆλΆ€ν„° μ„€λͺ…ν•œ ν”„λ‘œν† νƒ€μž…(prototype) μž…λ‹ˆλ‹€.

 

1975년에 Rosch λŠ” ν•œ κ°€μ§€ μ‹€ν—˜μ„ ν•©λ‹ˆλ‹€.

  • μ‹€ν—˜ μ°Έκ°€μžλ“€μ—κ²Œ μ—¬λŸ¬ λ²”μ£Ό ꡬ성원(사과, μ½”μ½”λ„›, μ˜€λ Œμ§€)의 속성을 적어보라고 함
  • 각 λ²”μ£Ό ꡬ성원에 λŒ€ν•΄ λ²”μ£Όμ˜ λ‹€λ₯Έ ꡬ성원과 κ³΅μœ ν•˜λŠ” μ†μ„±μ˜ 개수λ₯Ό λ„μΆœν•¨
  • 사과, μ˜€λ Œμ§€ : 2점(λ‘₯κΈ€λ‹€. 즙이 μžˆλ‹€.)
  • μ½”μ½”λ„› : 1점(λ‘₯κΈ€λ‹€)

μ μˆ˜κ°€ λ†’μ„μˆ˜λ‘ 전톡적인 λΆ„λ₯˜μ—μ„  λͺ¨λ‘ 과일둜 λ³Ό 수 μžˆμ§€λ§Œ, ν”„λ‘œν† νƒ€μž… μ΄λ‘ μ—μ„œλŠ” 사과와 μ˜€λ Œμ§€κ°€ κ°€μž₯ μ „ν˜•μ μΈ 무언가라고 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. λ°˜λ©΄μ— 코코넛은 μ € μ€‘μ—μ„œ κ°€μž₯ λΉ„μ „ν˜•μ μΈ κ²ƒμœΌλ‘œ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

 

이 μ‹€ν—˜μ„ 톡해 λ‘œμ‰¬λŠ” “인간은 ‘등급이 맀겨진 (κ°œλ…) ꡬ쑰(graded structure)’λ₯Ό κ°€μ§„λ‹€”라고 μ£Όμž₯ν•©λ‹ˆλ‹€.

인간은 사물을 λΆ„λ₯˜ν•  λ•Œ μžμ—°μŠ€λŸ½κ²Œ κ°€μž₯ μœ μ‚¬μ„± 높은 것 μˆœμ„œλŒ€λ‘œ 등급을 λ§€κΈ΄λ‹€λŠ” 의미둜 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

 

μ΄λ ‡κ²Œ λΆ„λ₯˜ν–ˆμ„ λ•Œ κ°€μž₯ 높은 등급을 κ°€μ§„ 녀석이 λ‚˜μ˜¬ ν…λ°μš”, 이것이 λ°”λ‘œ μ›ν˜•(Prototype)이닀. λž€ μ£Όμž₯이 ν”„λ‘œν† νƒ€μž… μ΄λ‘ μž…λ‹ˆλ‹€.

λ§¨μœ„μ—μ„œ “μ‹œμ œν’ˆμ΄λΌκ³  ν•˜λ©΄ λŒ€κ°œ μ•„λž˜μ˜ 경우 쀑 ν•˜λ‚˜ λ˜λŠ” 2개 ν•­λͺ© 이상에 ν•΄λ‹Ήλ˜λŠ” μ œν’ˆμ„ κ°€λ₯΄ν‚¨λ‹€.” 라고 ν”„λ‘œν†  νƒ€μž…μ˜ μ •μ˜λ₯Ό μ •μ˜ ν–ˆμŠ΅λ‹ˆλ‹€.

  1. μ˜€λ¦¬μ§€λ„, λ˜λŠ” 기반이 된 λͺ¨λΈ.
  2. λŒ€ν‘œμ μœΌλ‘œ μ œμ‹œν•  수 μžˆλŠ” μ˜ˆκ°€ λ˜λŠ” λͺ¨λΈ.
  3. μ’…λ₯˜μ˜ κΈ°μ΄ˆκ°€ λ˜λŠ” λͺ¨λΈ.
  4. μ•žμ„œ μ œμž‘λœ λͺ¨λΈ.

이제 무슨 말을 ν• μ§€ μ˜ˆμƒμ΄ λ˜μ‹œμ£ ??

 

기쑴의 λ ˆκ±°μ‹œ λΆ„λ₯˜λŠ” 약점이 λ§ŽμŠ΅λ‹ˆλ‹€.

μ‚¬λžŒμ΄ κ·Έμ € λΉ„μŠ·ν•˜λ‹€κ³  μƒκ°ν•œ 것듀을 λ¬Άμ–΄ 좔상화 ν•œκ²ƒμΈλ°, 이것이 μ •ν™•νžˆ λ“€μ–΄ λ§žλŠ” 것도 μ°ΎκΈ° νž˜λ“€κ³  μ‚¬λžŒλ§ˆλ‹€ λŠλΌλŠ”μ μ΄ λ‹€λ₯΄κΈ°μ— μ• λ§€ν•œ 것듀이 λ„ˆλ¬΄ 많기 λ•Œλ¬Έμ΄μ£ .

κ·Έλ ‡κΈ° λ•Œλ¬Έμ— μ–΄λ–€ μ›ν˜•(prototype)을 κΈ°μ€€μœΌλ‘œ μ–Όλ§ˆλ‚˜ μ›ν˜•κ³Ό κ°€κΉŒμš΄μ§€ ν˜Ήμ€ λ¨Όμ§€λ₯Ό 수치둜 λ‚˜νƒ€λ‚΄λŠ” 것이 μ•žμœΌλ‘œ μ„€λͺ…ν•  ν”„λ‘œν† νƒ€μž… μž…λ‹ˆλ‹€.

ν”„λ‘œν† νƒ€μž… 기반 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°

μ˜ˆμ‹œκ°€ μ’‹μ•„μ„œ λ‹€ λ“€κ³ μ™”μŠ΅λ‹ˆλ‹€.

function μ°Έμƒˆ(){
  this.λ‚ κ°œκ°―μˆ˜ = 2;
  this.λ‚ μˆ˜μžˆλ‚˜ = true;
}
const μ°Έμƒˆ1 = new μ°Έμƒˆ();

console.log("μ°Έμƒˆμ˜ λ‚ κ°œ 갯수 : ", μ°Έμƒˆ1.λ‚ κ°œκ°―μˆ˜); // 2

function λ‹­(){
this.벼슬 = true;
}
λ‹­.prototype = μ°Έμƒˆ1; // reference(였λ₯Έμͺ½μ΄ μΈμŠ€ν„΄μŠ€μΈ 점 μ£Όλͺ©)
const λ‹­1 = new λ‹­();
console.log("λ‹­1 λ‚ κ°œ : ", λ‹­1.λ‚ κ°œκ°―μˆ˜, ", λ‚ μˆ˜μžˆλ‚˜? ", λ‹­1.λ‚ μˆ˜μžˆλ‚˜); // 2, true
λ‹­1.λ‚ μˆ˜μžˆλ‚˜ = false;
console.log("λ‹€μ‹œ λ¬Όμ–΄λ³Έλ‹€. λ‹­1은 λ‚  수 μžˆλ‚˜? :", λ‹­1.λ‚ μˆ˜μžˆλ‚˜); // false
// μ•„λž˜λŠ” 고전적인 λ°©μ‹μ˜ ν”„λ‘œν† νƒ€μž… μ—°κ²°
function νŽ­κ·„(){
  μ°Έμƒˆ.call(this);    // copy properties
}
νŽ­κ·„.prototype = Object.create(μ°Έμƒˆ.prototype); // ν”„λ‘œν† νƒ€μž… μ—°κ²°
const νŽ­κ·„1 = new νŽ­κ·„();
console.log("νŽ­κ·„1 λ‚ κ°œ : ", νŽ­κ·„1.λ‚ κ°œκ°―μˆ˜, ", λ‚ μˆ˜μžˆλ‚˜? ", νŽ­κ·„1.λ‚ μˆ˜μžˆλ‚˜); // 2, true
νŽ­κ·„1.λ‚ μˆ˜μžˆλ‚˜ = false;
console.log("λ‹€μ‹œ λ¬Όμ–΄λ³Έλ‹€. νŽ­κ·„1은 λ‚  수 μžˆλ‚˜? :", νŽ­κ·„1.λ‚ μˆ˜μžˆλ‚˜); // false

μœ„ μ½”λ“œλŠ” μ•„λž˜μ²˜λŸΌ 도식화할 수 μžˆμŠ΅λ‹ˆλ‹€.

  • λ‹­1 의 μ›ν˜•(ν”„λ‘œν† νƒ€μž…)은 μ°Έμƒˆ1이닀
  • λ‹­1에 μ—†λŠ” 속성(λ‚ κ°œκ°―μˆ˜)은 ν”„λ‘œν† νƒ€μž… 체인을 톡해 μ°Έμ‘°λœλ‹€
  • λ‹­1에 λ™μΌν•œ 속성λͺ…(λ‚ μˆ˜μžˆλ‚˜)을 좔가해도 μ›ν˜•μ€ λ³€ν•˜μ§€ μ•ŠλŠ”λ‹€(μœ„μž„)> μ›λ¦¬μ μœΌλ‘œλŠ” λ‹­1을 톡해 μ›ν˜•(prototype)을 λ³€κ²½ν•˜λŠ”κ±΄ λΆˆκ°€λŠ₯ν•΄μ•Ό ν•œλ‹€. ν•˜μ§€λ§Œ JS 에선 λ¬Έλ²•μ μœΌλ‘œ κ°€λŠ₯. (ꢌμž₯ν•˜μ§€ μ•ŠμŒ)

클래슀둜 μœ„μ˜ μ½”λ“œλ₯Ό μ§€ μˆ˜λ„ μžˆκ² μ§€λ§Œ, μ°ΈμƒˆλΌλŠ” μ›ν˜•(ν”„λ‘œν† νƒ€μž…)을 두면 쑰금 더 μ§κ΄€μ μœΌλ‘œ μ‚¬λžŒμ΄ 인식할 수 있고, λ‹­κ³Ό νŽ­κ·„κ³Ό ν”„λ‘œν† νƒ€μž…μΈ μ°Έμƒˆμ˜ 차이가 쑰금 더 μ§κ΄€μ μœΌλ‘œ λ“€μ–΄μ˜΅λ‹ˆλ‹€.

λ‹€μŒμ€ ν”„λ‘œν†  νƒ€μž…μ„ μ‚¬μš©ν•˜κ³  쑰금 더 λ―Έμ‹œμ μΈ 관점(μ½”λ“œμ , js λ‚΄λΆ€)κ³Ό μ‚¬μš©λ²•μ— λŒ€ν•΄ μ•Œμ•„ λ³΄κ² μŠ΅λ‹ˆλ‹€!.

'개발 μ‹œλ‚˜λΈŒλ‘œ' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

promise  (0) 2023.05.21
λΈŒλΌμš°μ € λ Œλ”λ§  (1) 2023.05.13
this  (1) 2023.04.23
ν΄λ‘œμ € (closure)  (0) 2023.04.20
μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ  (0) 2023.04.08