μλ°μ€ν¬λ¦½νΈλ Java, Python μ²λΌ κ°μ²΄μ§ν₯μΈμ΄(Object-Oriented Programming, OOP)μ λλ€.
κ°μ²΄μ§ν₯μ΄λ νλ‘κ·Έλ¨μ κ·Έμ λ°μ΄ν°μ μ²λ¦¬λ°©λ²μΌλ‘ λλλκ² μλκ³ , νλ‘κ·Έλ¨μ λ€μμ "κ°μ²΄"λ‘ λ§λ€κ³ , μ΄λ€μ΄ μλ‘ μνΈμμ©μ ν΅ν΄ λ§λ€μ΄μ§λ λ°©μμ λλ€. μλ₯Ό λ€μ΄ μλμ°¨κ° μλ€κ³ νλ©΄ μλμ°¨μ λ°ν΄, μμ§, λμ΄ λ±μ κ°μ²΄λΌκ³ ν μ μμ΅λλ€. μ΄ κΈμ νλ‘ν νμ μ κ΄ν κΈ μ΄λ―λ‘ κ°μ²΄ μ§ν₯μ λν΄μ μ΄ μ λλ§ μκ³ κ°κ² μ΅λλ€.
νμ§λ§ ν΄λμ€κ° μ‘΄μ¬νλ Javaμλ λ¬λ¦¬ μλ°μ€ν¬λ¦½νΈ(μ΄ν JS)μλ ν΄λμ€λΌλ κ°λ μ΄ μμ΅λλ€. λμ JSμλ νλ‘ν νμ μ΄λΌλ κ°λ μ΄ μ‘΄μ¬ν©λλ€. μ΄ λλ¬Έμ JSκ° νλ‘ν νμ κΈ°λ°μ κ°μ²΄μ§ν₯ μΈμ΄λΌκ³ λΆλ¦¬λ μ΄μ μ λλ€.
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κ°κ° ν λΉλ κ²μ΄κ³ , μ΄κ²μ μλΉν λ©λͺ¨λ¦¬ λλΉλ₯Ό μ΄λν©λλ€. μ΄λ¬ν μ΄μ λλ¬Έμ νλ‘ν νμ μ μ¬μ©ν΄μΌν©λλ€.
νΉμ 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
μ μ½λλ νλ‘ν νμ μ μ¬μ©νμ¬ κ΅¬νν μ½λμ λλ€.
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μ΄λΌκ³ ν©λλ€.
prototype object
κ°μ²΄λ μΈμ λ ν¨μλ‘λΆν° μμ±λ©λλ€.
function Zoo(){}
var zooObj = new Zoo(); //=> zooObjλ κ°μ²΄, Zoo()λ ν¨μ
μ΄λ λ― κ°μ²΄λ μΈμ λ ν¨μλ‘λΆν° μμ±λ©λλ€. μ°λ¦¬κ° νν μ¬μ©νλ μΌλ°μ μΈ κ°μ²΄ μμ±λ λ§μ°¬κ°μ§μ λλ€.
var zooObj = {}//=> κ°μ²΄ μμ± λ°©λ²
μμ²λΌ κ°μ²΄λ₯Ό μμ±νλ λ°©λ²μ μ¬μ€ λ€μκ³Όλ κ°μ΅λλ€.
var zooObj = new Object();//=> μ΄λ κ²λ κ°μ²΄ μμ±μ΄ κ°λ₯ν¨
μ μ½λμμ Object()κ° JSμμ μ 곡νλ κΈ°λ³Έν¨μμ λλ€.
κ°μ²΄λ κ²°κ΅ ν¨μλ‘λΆν° μμ±λ©λλ€.
κ·ΈλΌ μ΄κ²μ΄ protype Object λ λ¬΄μ¨ μκ΄μ΄ μλλ?
ν¨μκ° μ μλ λ λ€μκ³Ό κ°μ 2κ°μ§ μΌμ΄ μΌμ΄λ©λλ€.
1. ν΄λΉ ν¨μμ Constructor(μμ±μ) μ격 λΆμ¬
Constructor μκ²©μ΄ λΆμ¬λμΌ new(μμ±μ)λ₯Ό ν΅ν΄ κ°μ²΄λ₯Ό μμ±ν μ μμ΅λλ€. μ΄κ²μ΄ ν¨μλ§μ΄ new ν€μλλ₯Ό μ¬μ©ν μ μλ μ΄μ μ λλ€.
2. ν΄λΉ ν¨μμ prototype Object μμ± λ° μ°κ²°
ν¨μκ° μμ±λ λ μμ±λ ν¨μλ prototype μ΄λΌλ μμ±μ κ°μ§κ² λ©λλ€. μ΄ prototypeμ΄λΌλ μμ±μ prototype Object λΌλ κ°μ²΄μ μ κ·Όμ κ°λ₯νκ² ν΄μ€λλ€. λ prototype Objectλ μΌλ°μ μΈ κ°μ²΄μ κ°μΌλ©°, κΈ°λ³Έμμ±μΌλ‘ constructor, __proto__λ₯Ό κ°μ§λλ€.
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
μ¬μ‘μ¬ Aμ lionκ³Ό tigerλΌλ μμ±μ΄ μλλ° λ³΄μλ λ°μ κ°μ΄ 2μ 3μ΄ μΆλ ₯λ©λλ€. new Zoo() λ‘ μμ±λ κ°μ²΄ μ¬μ‘μ¬ Aκ° μ‘°μμ΄μλ Zoo ν¨μμ prototype Objectλ₯Ό μ°Έμ‘°ν μ μμκΈ°μ μμ κ°μ κ²°κ³Όλ₯Ό μΆλ ₯ν μ μμλ κ²μ λλ€. κ·Έλ¦¬κ³ μ΄λ¬ν κ²°κ³Όλ₯Ό κ°λ₯μΌ ν΄μ£Όλ κ²μ΄ λ°λ‘ prototype Link μ¦, __proto__ μ λλ€.
prototype μμ±μ ν¨μλ§ κ°μ§κ³ μλ λ°λ©΄, __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
'...' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Spring] μλΈλ¦Ώμ΄λ? (0) | 2020.12.22 |
---|---|
[DB] RDS, NoSQL κ·Έλ¦¬κ³ NewSQL (0) | 2020.12.21 |
[DB] μ ν, λ°μ ν, λΉμ ν λ°μ΄ν° (1) | 2020.12.16 |
[DB] λ°μ΄ν°λ² μ΄μ€μ κΈ°λ³Έ κ°λ (1) | 2020.12.16 |
[JS] λλ§μ μ² νμ΄ λ΄κΈ΄ μ½λλ?? (2) | 2020.12.16 |