λ‘œμΌ“πŸΎ
article thumbnail
λ°˜μ‘ν˜•

https://www.debuggr.io/js-prototype-in-depth/

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” Java, Python 처럼 객체지ν–₯μ–Έμ–΄(Object-Oriented Programming, OOP)μž…λ‹ˆλ‹€.

객체지ν–₯μ΄λž€ ν”„λ‘œκ·Έλž¨μ„ κ·Έμ € 데이터와 μ²˜λ¦¬λ°©λ²•μœΌλ‘œ λ‚˜λˆ„λŠ”κ²Œ μ•„λ‹ˆκ³ , ν”„λ‘œκ·Έλž¨μ„ λ‹€μˆ˜μ˜ "객체"둜 λ§Œλ“€κ³ , 이듀이 μ„œλ‘œ μƒν˜Έμž‘μš©μ„ 톡해 λ§Œλ“€μ–΄μ§€λŠ” λ°©μ‹μž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ μžλ™μ°¨κ°€ μžˆλ‹€κ³  ν•˜λ©΄ μžλ™μ°¨μ˜ 바퀴, 엔진, 도어 등을 객체라고 ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이 글은 ν”„λ‘œν† νƒ€μž…μ— κ΄€ν•œ κΈ€ μ΄λ―€λ‘œ 객체 지ν–₯에 λŒ€ν•΄μ„  이 μ •λ„λ§Œ μ•Œκ³  κ°€κ² μŠ΅λ‹ˆλ‹€.

 

ν•˜μ§€λ§Œ ν΄λž˜μŠ€κ°€ μ‘΄μž¬ν•˜λŠ” Javaμ™€λŠ” 달리 μžλ°”μŠ€ν¬λ¦½νŠΈ(μ΄ν•˜ JS)μ—λŠ” ν΄λž˜μŠ€λΌλŠ” κ°œλ…μ΄ μ—†μŠ΅λ‹ˆλ‹€.      λŒ€μ‹  JSμ—λŠ” ν”„λ‘œν† νƒ€μž…μ΄λΌλŠ” κ°œλ…μ΄ μ‘΄μž¬ν•©λ‹ˆλ‹€. 이 λ•Œλ¬Έμ— JSκ°€ ν”„λ‘œν† νƒ€μž… 기반의 객체지ν–₯ 언어라고 λΆˆλ¦¬λŠ” μ΄μœ μž…λ‹ˆλ‹€.

 

http://polyglot-m.blogspot.com/2015/12/ecma6-babeljs-webpack-es6-using-react.html

 

ECMA6μ—μ„œ 클래슀 문법이 μΆ”κ°€λ˜μ—ˆμ§€λ§Œ 이것이 JSκ°€ Java처럼 클래슀 기반의 μ–Έμ–΄λ‘œ λ°”λ€ŒλŠ” 것은 μ•„λ‹™λ‹ˆλ‹€. κ·Έμ € μ‚¬μš©λ§Œ ν•  수 μžˆλŠ” κ²ƒμ΄μ§€μš”.

그럼 ν”„λ‘œν† νƒ€μž…μ€ 무엇이고 어디에 μ‚¬μš©ν• κΉŒμš”?

JSλŠ” ν•¨μˆ˜μ™€ new(μƒμ„±μž)λ₯Ό μ΄μš©ν•˜μ—¬ 클래슀 마λƒ₯ λΉ„μŠ€λ¬΄λ¦¬ν•˜κ²Œ κ΅¬ν˜„ν•  μˆ˜λŠ” μžˆμŠ΅λ‹ˆλ‹€.

 

function Zoo(){//=> ν•¨μˆ˜
    this.lion = 2;
    this.tiger = 3;   
}

var zooKeeper_A = new Zoo(); //=> 객체
var zooKeeper_B = new Zoo(); //=> 객체

console.log(zooKeeper_A.lion); //=> 2
console.log(zooKeeper_A.tiger); //=> 3

console.log(zooKeeper_B.lion); //=> 2
console.log(zooKeeper_B.tiger);//=> 3

 

A μ‚¬μœ‘μ‚¬μ™€ B μ‚¬μœ‘μ‚¬λŠ” lionκ³Ό tiger을 각 2κ°œμ”© 가지고 μžˆμŠ΅λ‹ˆλ‹€.  그리고 λ©”λͺ¨λ¦¬μ—λŠ” lionκ³Ό tigerκ°€ 총 4개 ν• λ‹Ήλ©λ‹ˆλ‹€. λ§Œμ•½ 1000개의 객체가 μžˆλ‹€λ©΄ λ©”λͺ¨λ¦¬μ—λŠ” 총 2000κ°œκ°€ 할당될 것이고, 이것은 μƒλ‹Ήν•œ λ©”λͺ¨λ¦¬ λ‚­λΉ„λ₯Ό μ΄ˆλž˜ν•©λ‹ˆλ‹€. μ΄λŸ¬ν•œ 이유 λ•Œλ¬Έμ— ν”„λ‘œν† νƒ€μž…μ„ μ‚¬μš©ν•΄μ•Όν•©λ‹ˆλ‹€.

 

속성 4κ°œκ°€ ν• λ‹Ήλœ 것을 볼수 μžˆμ§€μš”. 그리고 __proto__λŠ” 이 κΈ€ λ’€μ—μ„œ μ„€λͺ…ν•˜κ² μŠ΅λ‹ˆλ‹€.

 

ν˜Ήμ‹œ this.tiger = 3 λΌμ„œ 2개, 3κ°œμ”© 가지고 μžˆμ§€ μ•ŠλŠλƒ μƒκ°ν•˜μ‹€μˆ˜λ„ μžˆκ² μ§€λ§Œ μ—¬κΈ°μ„  각 2κ°œμ”© κ°€μ§„λ‹€λŠ”κ±΄ μ†μ„±μ˜ 갯수λ₯Ό λ§ν•˜λŠ” κ²λ‹ˆλ‹€. lion 속성과 tigerλΌλŠ” 속성 총 2개λ₯Ό 가지고 μžˆλŠ” κ²ƒμ΄μ§€μš”.

 

function Zoo(){}

Zoo.prototype.lion = 2; //ν”„λ‘œν† νƒ€μž… 속성인 lion
Zoo.prototype.tiger = 3; //ν”„λ‘œν† νƒ€μž… 속성인 tiger

var zookeeper_A = new Zoo();
var zookeeper_B = new Zoo();

console.log(zooKeeper_A.lion); //=> 2
console.log(zooKeeper_A.tiger); //=> 3

console.log(zooKeeper_B.lion); //=> 2
console.log(zooKeeper_B.tiger); //=> 3

 

μœ„ μ½”λ“œλŠ” ν”„λ‘œν† νƒ€μž…μ„ μ‚¬μš©ν•˜μ—¬ κ΅¬ν˜„ν•œ μ½”λ“œμž…λ‹ˆλ‹€.

 

ν”„λ‘œν† νƒ€μž… μ‚¬μš© μ „ 각 객체
ν”„λ‘œν† νƒ€μž… μ‚¬μš© ν›„ μ–΄λ”˜κ°€μ— μžˆμ„ prototype의 속성을 κ³΅μœ ν•˜λŠ” μ‚¬μœ‘μ‚¬A,B

 

Zoo.prototype μ΄λΌλŠ” prototype Object κ°€ λ©”λͺ¨λ¦¬ μ–΄λ”˜κ°€μ— μ‘΄μž¬ν•˜κ³  μžˆμ„ 것이고, Zoo ν•¨μˆ˜λ‘œ μƒμ„±λœ μ‚¬μœ‘μ‚¬A, μ‚¬μœ‘μ‚¬B 객체듀은 λ©”λͺ¨λ¦¬ μ–΄λ”˜κ°€μ— μžˆμ„ prototype Object λ₯Ό μ‚¬μš©ν•  수 있게 λ©λ‹ˆλ‹€. 

(prototype Object에 κ΄€ν•΄μ„œλŠ” μ•„λž˜μ—μ„œ μ„€λͺ…ν•©λ‹ˆλ‹€.)

 

즉, λ©”λͺ¨λ¦¬ μ–΄λ”˜κ°€μ— μ‘΄μž¬ν•  prototype의 lion, tiger 속성을 μ‚¬μœ‘μ‚¬A, μ‚¬μœ‘μ‚¬Bκ°€ κ³΅μœ ν•˜μ—¬ μ‚¬μš©ν•  수 있게 λ©λ‹ˆλ‹€.

 

prototype Link 와 prototype Object

 

prototype Link 와 Prototype Object, 이 λ‘˜μ„ 톡틀어 prototype이라고 ν•©λ‹ˆλ‹€.

 

Link + Object = prototype

 

prototype object

κ°μ²΄λŠ” μ–Έμ œλ‚˜ ν•¨μˆ˜λ‘œλΆ€ν„° μƒμ„±λ©λ‹ˆλ‹€.

function Zoo(){}

var zooObj = new Zoo(); //=> zooObjλŠ” 객체, Zoo()λŠ” ν•¨μˆ˜

 

이렇듯 κ°μ²΄λŠ” μ–Έμ œλ‚˜ ν•¨μˆ˜λ‘œλΆ€ν„° μƒμ„±λ©λ‹ˆλ‹€. μš°λ¦¬κ°€ ν”νžˆ μ‚¬μš©ν•˜λŠ” 일반적인 객체 생성도 λ§ˆμ°¬κ°€μ§€μž…λ‹ˆλ‹€.

 

var zooObj = {}//=> 객체 생성 방법

 

μœ„μ²˜λŸΌ 객체λ₯Ό μƒμ„±ν•˜λŠ” 방법은 사싀 λ‹€μŒκ³Όλ„ κ°™μŠ΅λ‹ˆλ‹€.

 

var zooObj = new Object();//=> μ΄λ ‡κ²Œλ„ 객체 생성이 κ°€λŠ₯함

 

μœ„ μ½”λ“œμ—μ„œ Object()κ°€ JSμ—μ„œ μ œκ³΅ν•˜λŠ” κΈ°λ³Έν•¨μˆ˜μž…λ‹ˆλ‹€.

객체λ₯Ό μƒμ„±μ‹œμΌœμ£ΌλŠ” Object λ˜ν•œ ν•¨μˆ˜μž…λ‹ˆλ‹€.

 

객체도 κ²°κ΅­ ν•¨μˆ˜λ‘œλΆ€ν„° μƒμ„±λ©λ‹ˆλ‹€.

 

그럼 이것이 protype Object λž‘ 무슨 상관이 μžˆλŠλƒ?

 

ν•¨μˆ˜κ°€ μ •μ˜λ  λ•Œ λ‹€μŒκ³Ό 같은 2가지 일이 μΌμ–΄λ‚©λ‹ˆλ‹€.

 

1. ν•΄λ‹Ή ν•¨μˆ˜μ— Constructor(μƒμ„±μž) 자격 λΆ€μ—¬

 

Constructor 자격이 λΆ€μ—¬λ˜μ•Ό new(μƒμ„±μž)λ₯Ό 톡해 객체λ₯Ό 생성할 수 μžˆμŠ΅λ‹ˆλ‹€. 이것이 ν•¨μˆ˜λ§Œμ΄ new ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•  수 μžˆλŠ” μ΄μœ μž…λ‹ˆλ‹€.

 

ObjλŠ” 객체이기 λ•Œλ¬Έμ— new μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€!

 

2. ν•΄λ‹Ή ν•¨μˆ˜μ˜ prototype Object 생성 및 μ—°κ²°

 

 

ν•¨μˆ˜κ°€ 생성될 λ•Œ prototype κ³Ό prototype Objectκ°€ μƒκΉλ‹ˆλ‹€.

 

ν•¨μˆ˜κ°€ 생성될 λ•Œ μƒμ„±λœ ν•¨μˆ˜λŠ” prototype μ΄λΌλŠ” 속성을 κ°€μ§€κ²Œ λ©λ‹ˆλ‹€. 이 prototypeμ΄λΌλŠ” 속성은 prototype Object λΌλŠ” 객체에 접근을 κ°€λŠ₯ν•˜κ²Œ ν•΄μ€λ‹ˆλ‹€. 또 prototype ObjectλŠ” 일반적인 객체와 κ°™μœΌλ©°, κΈ°λ³Έμ†μ„±μœΌλ‘œ constructor, __proto__λ₯Ό κ°€μ§‘λ‹ˆλ‹€.

 

Zoo.prototype을 μ£Όλͺ©!!

 

function Zoo의 속성인 prototype은 Zoo prototype Objectλ₯Ό κ°€λ₯΄ν‚€κ³  Zoo prototype Object의 속성 constructorλŠ” function Zooλ₯Ό κ°€λ₯΄ν‚΅λ‹ˆλ‹€.

(constructor 말고 __proto__λΌλŠ” 것도 μƒμ„±λ˜λŠ” 데 이것은 λ°‘μ—μ„œ μ„€λͺ…ν•˜κ² μŠ΅λ‹ˆλ‹€.)

 

function Zoo(){}

Zoo.prototype.lion = 2; //ν”„λ‘œν† νƒ€μž… 속성인 lion
Zoo.prototype.tiger = 3; //ν”„λ‘œν† νƒ€μž… 속성인 tiger

var zookeeper_A = new Zoo();
var zookeeper_B = new Zoo();

console.log(zooKeeper_A.lion); //=> 2
console.log(zooKeeper_A.tiger); //=> 3

console.log(zooKeeper_B.lion); //=> 2
console.log(zooKeeper_B.tiger); //=> 3

 

이제 이 μ½”λ“œλ₯Ό 보고 쑰금 이해가 κ°€μ‹œλ‚˜μš”?? prototype ObjectλŠ” 일반 κ°μ²΄μ΄λ―€λ‘œ λ§ˆμŒλŒ€λ‘œ 속성 μΆ”κ°€/μ‚­μ œκ°€ κ°€λŠ₯ν•©λ‹ˆλ‹€. 또 μ‚¬μœ‘μ‚¬ A와 μ‚¬μœ‘μ‚¬ BλŠ” Zoo λΌλŠ” ν•¨μˆ˜λ₯Ό 톡해 μƒμ„±λ˜μ—ˆμœΌλ‹ˆ Zoo.prototype 을 μ°Έμ‘°ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ μœ„ μ½”λ“œμ™€ 같이 좜λ ₯ν•  수 μžˆμ—ˆλ˜ κ²λ‹ˆλ‹€.

 

prototype Link

 

prototype Link

 

μ‚¬μœ‘μ‚¬ A에 lionκ³Ό tigerλΌλŠ” 속성이 μ—†λŠ”λ° λ³΄μ‹œλŠ” 바와 같이 2와 3이 좜λ ₯λ©λ‹ˆλ‹€. new Zoo() 둜 μƒμ„±λœ 객체 μ‚¬μœ‘μ‚¬ Aκ°€ μ‘°μƒμ΄μ˜€λ˜ Zoo ν•¨μˆ˜μ˜ prototype Objectλ₯Ό μ°Έμ‘°ν•  수 μžˆμ—ˆκΈ°μ— μœ„μ™€ 같은 κ²°κ³Όλ₯Ό 좜λ ₯ν•  수 μžˆμ—ˆλ˜ κ²ƒμž…λ‹ˆλ‹€. 그리고 μ΄λŸ¬ν•œ κ²°κ³Όλ₯Ό κ°€λŠ₯μΌ€ ν•΄μ£ΌλŠ” 것이 λ°”λ‘œ prototype Link 즉, __proto__ μž…λ‹ˆλ‹€.

 

constructorλŠ” ν•¨μˆ˜κ°€, __proto__λŠ” 객체가!

 

prototype 속성은 ν•¨μˆ˜λ§Œ 가지고 μžˆλŠ” 반면, __proto__λŠ” λͺ¨λ“  객체가 가지고 μžˆλŠ” μ†μ„±μž…λ‹ˆλ‹€. 

 

__proto__κ°€ κ°€λ₯΄ν‚€λŠ” 객체에 μ£Όλͺ©

 

__proto__ λŠ” 객체가 생성될 λ•Œ μ‘°μƒμ΄μ˜€λ˜ ν•¨μˆ˜μ˜ prototype Objectλ₯Ό κ°€λ₯΄ν‚€κ²Œ λ©λ‹ˆλ‹€. λ”°λΌμ„œ μ‚¬μœ‘μ‚¬ AλŠ” Zoo ν•¨μˆ˜λ‘œλΆ€ν„° μƒμ„±λ˜μ—ˆμœΌλ‹ˆ Zoo ν•¨μˆ˜μ˜ prototype Objectλ₯Ό κ°€λ₯΄ν‚΅λ‹ˆλ‹€. 

 

 

 

μ‚¬μœ‘μ‚¬ Aκ°€ lion, tiger λ₯Ό 직접 가지고 μžˆμ§€ μ•Šμ•„ lion, tiger 속성을 찾을 λ•ŒκΉŒμ§€ μƒμœ„ ν”„λ‘œν† νƒ€μž…μ„ νƒμƒ‰ν•˜κ²Œ λ©λ‹ˆλ‹€. λ§Œμ•½ μ΅œμƒμœ„ Object인 Object prototype Object κΉŒμ§€ λ„λ‹¬ν–ˆλŠ” 데 μ—†λ‹€λ©΄ undefinedλ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€. μ΄λ ‡κ²Œ __proto__ 속성을 톡해 μƒμœ„ ν”„λ‘œν† νƒ€μž…κ³Ό μ—°κ²°λ˜μ–΄ μžˆλŠ” ν˜•νƒœλ₯Ό ν”„λ‘œν† νƒ€μž… 체인이라고 ν•©λ‹ˆλ‹€.

 

 

μ΄λŸ¬ν•œ ν”„λ‘œν† νƒ€μž… 체인 ꡬ쑰 덕뢄에 λͺ¨λ“  κ°μ²΄λŠ” Object의 μžμ‹μ΄λΌκ³  뢈리고 Object prototype Object의 λͺ¨λ“  속성을 μ‚¬μš©ν•  수 있게 λ©λ‹ˆλ‹€.

 

μš”μ•½

1. ν•¨μˆ˜κ°€ 생성될 λ•Œ 2가지 일이 λ°œμƒν•©λ‹ˆλ‹€.

  • constructor 자격 λΆ€μ—¬ κΆŒν•œ
  • ν•΄λ‹Ήν•¨μˆ˜μ˜ prototype 속성과 prototype Objectλ₯Ό 가지며 prototype ObjectλŠ” constructorκ³Ό __proto__ 속성을 κ°–μŠ΅λ‹ˆλ‹€.

 

2. prototype은 prototype Object λ₯Ό κ°€λ₯΄ν‚€κ³ , prototype Object의 constructor 속성을 ν•¨μˆ˜λ₯Ό κ°€λ₯΄ν‚΅λ‹ˆλ‹€.

 

3. prototype Link 인 __proto__ λŠ” λͺ¨λ“  객체가 κ°€μ§€λŠ” 속성이며 μƒμœ„ ν”„λ‘œν† νƒ€μž… κ°„ 연결을 ν•΄μ€λ‹ˆλ‹€.

 

4. __proto__ μ†μ„±μ˜ νŠΉμ§• 덕뢄에 ν”„λ‘œν† νƒ€μž… 체인 ν˜•νƒœλ₯Ό κ°€μ§ˆμˆ˜ μžˆμŠ΅λ‹ˆλ‹€.

 

5. Object prototype Object λŠ” λͺ¨λ“  객체가 μ ‘κ·Ό κ°€λŠ₯ν•©λ‹ˆλ‹€.(κ°€μž₯ μ΅œμƒμœ„ ν”„λ‘œν† νƒ€μž…μ΄κΈ° λ•Œλ¬Έ)

 

μ½μ–΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€.

μ§ˆλ¬Έμ€ μ–Έμ œλ‚˜ ν™˜μ˜ν•©λ‹ˆλ‹€.

 

"λ‚œ λ°˜λ“œμ‹œ λ°±μ—”λ“œ 왕이 될거야"

 

 

 

 

 

Javascript 기초 - Object prototype μ΄ν•΄ν•˜κΈ° | Insanehong's Incorrect Note

μ†Œκ°œ 이번 κΈ€μ—μ„œ λ‹€λ£° λ‚΄μš©μ€ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ ν”„λ‘œν† νƒ€μž… 상속(prototypal inheritance) μ΄λΌλŠ” ν™•μž₯κ³Ό 객체의 μž¬μ‚¬μš©μ„ κ°€λŠ₯ν•˜κ²Œ ν•΄μ£Όλ©° class 기반으둜 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜μ§€ μ•ŠλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ

insanehong.kr

 

 

λ°˜μ‘ν˜•
profile on loading

Loading...