κ°μ²΄ μ§ν₯
κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μ΄λ?
νλμ μ²μ¬μ§μ λ§λ€κ³
κ·Έ μ²μ¬μ§μ λ°νμΌλ‘, μ¦ μλ°μ€ν¬λ¦½νΈμμλ classλ₯Ό λ°νμΌλ‘ νλ
νλμ κ°μ²΄, μ¦ instanceλ₯Ό λ§λλ νλ‘κ·Έλλ° ν¨ν΄μ μλ―Ένλ€.
βοΈ ν΄λμ€μ μΈμ€ν΄μ€
ν΄λμ€λ μμ±κ³Ό λ©μλλ₯Ό μ μνλ 곡κ°μ΄κ³ μΈμ€ν΄μ€λ ν΄λμ€μμ μ μλ μ 보λλ₯Ό κ°μ Έμ μ΄μ©νλ κ°μ²΄μ΄λ€.
μμ±μ ν΄λμ€μ ν¬ν¨λλ λ³μλ₯Ό μλ―Ένκ³ , λ©μλλ ν΄λμ€μ ν¬ν¨λλ ν¨μλ₯Ό μλ―Ένλ€.
ν΄λμ€λ₯Ό μ μνλ λ°μλ 2κ°μ§ λ°©λ²μ΄ μλ€.
- ν¨μλ‘ μ μ (ES5 λ¬Έλ²)
function Introduce(name, age, favorite) {
// μΈμ€ν΄μ€ λ§λ€μ΄μ§ λ μ€νλλ μ½λ
}
- class ν€μλλ‘ μ μ (ES6 λ¬Έλ²)
class Introduce {
constructor(name, age, favorite) {
// μΈμ€ν΄μ€κ° λ§λ€μ΄μ§ λ μ€νλλ μ½λ
}
}
μ¬κΈ°μ constructor
λ ν΄λμ€κ° μΈμ€ν΄μ€ κ°μ²΄λ₯Ό μμ±ν λ κ°μ²΄λ₯Ό μ΄κΈ°ννλ λ©μλμ΄λ€.
constructor
λ©μλλ₯Ό λ€μκ³Ό κ°μ΄ μ¬μ©νλ€λ©΄,
class Person {
constructor() {
this.name = 'subin';
}
}
let sujin = new Person();
Person
ν΄λμ€μ μμ±μ λ©μλμ this.name = 'subin'
μ μν΄ sujin.name
μ κ°μ 'subin'
μΌλ‘ κ³ μ λλ κ²μΌλ‘ μ΄κΈ°νλ₯Ό μννλ€.
λ§μ½, constructor
λ©μλκ° μλμ κ°μ΄ μ¬μ©λλ©΄
class Person {
constructor(name) {
this.name = name;
}
}
let sujin = new Person('sujin');
μ΄λ²μλ 첫 λ²μ§Έ μμμ λ€λ₯΄κ² construnctor
ν΄λμ€ μμ±μμ name
μμ±μ λΆμ¬νκΈ° λλ¬Έμ, sujin.name
μ μΈμ€ν΄μ€ κ°μ²΄λ₯Ό μμ±νλ©΄μ μ€μ ν μμ±κ° 'sujin'
μ΄ λλ€.
μΈμ€ν΄μ€λ μμ±ν λ new
ν€μλλ₯Ό μ΄μ©νλ€.
let myself = new Introduce('subin', 28, 'apeach');
Introduce
λΌλ ν΄λμ€λ₯Ό λ§λ€μλ€κ³ κ°μ νκ³ , myself
λΌλ μΈμ€ν΄μ€ κ°μ²΄λ₯Ό λ§λ€κ³ μ νλ€λ©΄ Introduce
ν΄λμ€ λͺ
μμ new
λΌλ ν€μλλ₯Ό λΆμ¬ let myself = new Introduce();
μ ννλ‘ μΈμ€ν΄μ€λ₯Ό λ§λ€ μ μλ€.
μμ±μ λ©μλμ μ μλ μμ±μ΄ μ‘΄μ¬νλ€λ©΄ μΈμ€ν΄μ€λ₯Ό μμ±ν λ μμ± μ 보λ₯Ό ν¨κ» μ λ ₯νλ€.
βοΈ ν΄λμ€μ ES5μ ES6 λ¬Έλ² μ°¨μ΄
μμμ ν΄λμ€λ₯Ό μ μνλλ° 2κ°μ§ λ°©λ²μ΄ μλ€κ³ νμλλ°, ν΄λμ€ λ΄μ λ©μλλ₯Ό μμ±ν λ λ μ°¨μ΄λ₯Ό λλλ¬μ§κ² 보μ¬μ€λ€.
- ES5 λ¬Έλ²
function Introduce(name, age, favorite) {
this.name = name;
this.age = age;
this.favorite = favorite;
}
Introduce.prototype.study = function() {
// 곡λΆνλ μκ°μ μλ €μ£Όλ μ½λ
}
Introduce.prototype.game = function() {
// κ²μνλ μκ°μ μλ €μ£Όλ μ½λ
}
Introduce.prototype.sleep = function() {
// μ μλ μκ°μ μλ €μ£Όλ μ½λ
}
μμ μ½λμμ λ³Ό μ μλ―μ΄ ν¨μλ‘ μ μν Introduce
ν΄λμ€ λ΄μμλ μμ±μ λν μ΄κΈ°νλ§ ν΄μ£Όκ³ , κ·Έ μΈ λ©μλλ μ λΆ ν¨μ λ°κΉ₯μμ prototype
ν€μλλ₯Ό μ¬μ©ν΄ μ μν΄μ€λ€.
- ES6 λ¬Έλ²
class Introduce {
constructor(name, age, favorite) {
this.name = name;
this.age = age;
this.favorite = favorite;
}
study() {
// 곡λΆνλ μκ°μ μλ €μ£Όλ μ½λ
}
game() {
// κ²μνλ μκ°μ μλ €μ£Όλ μ½λ
}
sleep() {
// μ μλ μκ°μ μλ €μ£Όλ μ½λ
}
}
λ°λ©΄μ ES6 λ¬Έλ²μμλ Introduce
ν΄λμ€ λ΄μ constructor
λ©μλμ ν¨κ» λ¬Άμ΄μ λ€λ₯Έ λ©μλλ₯Ό μ μνλ λͺ¨μ΅μ λ³Ό μ μλ€.
κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°
κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°(Object Oriented Programming, OOP)μ΄λ?
νλμ μ²μ¬μ§μ λ§λ€κ³
κ·Έ μ²μ¬μ§μ λ°νμΌλ‘, μ¦ μλ°μ€ν¬λ¦½νΈμμλ classλ₯Ό λ°νμΌλ‘ νλ
νλμ κ°μ²΄, μ¦ instanceλ₯Ό λ§λλ νλ‘κ·Έλλ° ν¨ν΄μ μλ―Ένλ€.
μ‘°κΈ λ λ§λΆμ΄μλ©΄,
κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μ λͺ¨λ κ²μ "κ°μ²΄"λ‘ λ°μλ€μ΄κ³ κΈ°μ‘΄μ λ§λ€μ΄ λ κ°μ²΄λ₯Ό μ¬μ¬μ©ν μ μλ€.
βοΈ OOPμ 4κ°μ§ νΉμ§
μΊ‘μν(Encapsulation)
: κ°μ²΄μ μμ±κ³Ό λ©μλλ₯Ό νλλ‘ λ¬Άλ κ²μ λ§νλ€. νΉμ μμ±μ΄λ λ©μλλ₯Ό κ°μΆ μ μκΈ° λλ¬Έμ μ 보 μλμΌλ‘ μ¬μ©ν μ μλ€.
λλΆλΆμ κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ° μΈμ΄λ ν΄λμ€λ₯Ό μ μνκ³ κ·Έ ν΄λμ€λ₯Ό ꡬμ±νλ μμ±κ³Ό λ©μλμ λν΄ public
, private
, protected
μ κ°μ μ κ·Ό μ νμλ₯Ό μ μΈν΄ κ³΅κ° λ²μλ₯Ό νμ ν μ μλ€.
public
μ ν΄λμ€ μΈλΆμμ μ°Έμ‘° κ°λ₯ν μμ±κ³Ό λ©μλ, private
λ ν΄λμ€ μΈλΆμμ μ°Έμ‘° λΆκ°λ₯ν μμ±κ³Ό λ©μλ, protected
λ μμλ°λ κ°μ²΄μ νν΄μ μ°Έμ‘° κ°λ₯νκ² νλ μμ±κ³Ό λ©μλλ₯Ό μλ―Ένλ€.
μλ°μ€ν¬λ¦½νΈμμλ λ¬Έλ²μ μΌλ‘ μ κ·Ό μ νμλ₯Ό μ 곡νμ§λ μκ³ κΈ°λ³Έμ μΌλ‘ κ°μ²΄μ λͺ¨λ μμ±κ³Ό λ©μλκ° public
νλ©°, μμ±μ΄λ λ©μλ μ΄λ¦ μμ μΈλ λ°(_)
λ₯Ό λΆμ¬ μ κ·Όμ μ νν μ μλ€.
μΆμν(Abstraction)
: λ€μν μμ±κ³Ό λ©μλ μ€μμ νμν κ²λ§ νννλ κ²μ μλ―Ένλ€.
μ¬λ
μ΄λΌλ ν΄λμ€κ° μλ€κ³ νλ©΄ κ·Έ μμλ μ΄λ¦, λμ΄, ν€, λͺΈλ¬΄κ², μ§μ
λ±μ λ€μν μμ±κ³Ό λ©μλκ° μλ€κ³ κ°μ νμ. μ¬κΈ°μ μνλ μ λ³΄λ§ κ°μ Έμ νμ
μ΄λΌλ ν΄λμ€λ₯Ό μλ‘ λ§λ€λ©΄ νμκ³Ό κ΄λ ¨λμ΄ μλ μμ±κ³Ό λ©μλλ§ μΆμΆν΄μ ꡬμ±μ νκ² λλ€.
μ΄μ κ°μ΄ νμν μ λ³΄λ§ κ°μ Έμ ꡬμ±νλ κ²μ μΆμν
λΌκ³ νλ€.
μμ(Inheritance)
: μ΄λ€ κ°μ²΄μ μμ±κ³Ό λ©μλλ₯Ό λ€λ₯Έ κ°μ²΄κ° κ·Έλλ‘ μ¬μ©ν μ μλ κ²μ μλ―Ένλ€.
λλ¬Ό
μ΄λΌλ ν΄λμ€κ° μλ€κ³ κ°μ νμ. κ°μμ§
, κ³ μμ΄
, μ
λ±μ λ³Έμ§μ μΌλ‘ λλ¬Όμ νμμ΄κΈ° λλ¬Έμ λλ¬Ό
ν΄λμ€λ₯Ό μμλ°μ μμ±ν μ μλ€. μμλ°μ μμ±λ κ°μμ§
, κ³ μμ΄
, μ
ν΄λμ€λ κΈ°λ³Έ ν΄λμ€μΈ λλ¬Ό
ν΄λμ€μ μμ±κ³Ό λ©μλλ₯Ό μ¬μ©ν μ μλ€.
λ€νμ±(Polymorphism)
: μ΄λ€ λ³μλ λ©μλκ° μν©μ λ°λΌμ λ€λ₯Έ κ²°κ³Όλ₯Ό 보μ¬μ£Όλ κ²μ μλ―Ένλ€.
κ°μμ§
, κ³ μμ΄
, μ
λ μ λΆ λλ¬Ό
ν΄λμ€μ νμ ν΄λμ€μ΄μ§λ§ κ° λλ¬Όλ€μ μΈμμ리λ μ λΆ λ€λ₯΄λ€. λλ¬Ό
ν΄λμ€μ μΈμμ리()
λΌλ λ©μλκ° μλ€κ³ κ°μ νλ©΄ νμ ν΄λμ€μλ μΈμμ리()
λΌλ λ©μλκ° μ‘΄μ¬νκ² λλ€. νμ ν΄λμ€λ€μ μΈμμ리()
λ©μλλ₯Ό κ° λλ¬Όμ λ§κ² μλ‘ μμ±νλ©΄ κ° νμ ν΄λμ€μ λ©μλλ₯Ό μ€νν¨μ λ°λΌ λ€λ₯Έ κ²°κ³Όλ₯Ό 보μ¬μ£Όκ² λλ€.
νλ‘ν νμ
νλ‘ν νμ μ΄λ?
νλ‘ν νμ μ μν κ°μ²΄λ‘, μ΄λ€ κ°μ²΄μ λΆλͺ¨ κ°μ²΄ μν μ νλ κ°μ²΄μ΄λ€.
βοΈ .prototypeμ __proto__
prototype
μμ±μ ν¨μ κ°μ²΄λ§μ΄ μμ νλ μμ±μΌλ‘ μμ±μκ° μμ±ν μΈμ€ν΄μ€μ νλ‘ν νμ
μ, __proto__
μ κ·Όμ μμ±μ μμ μ νλ‘ν νμ
μ κ°μ μ μΌλ‘ μ κ·Όν μ μλ μμ±μ κ°λ¦¬ν¨λ€.
prototype
μ μμ±μ ν¨μκ°, __proto__
λ λͺ¨λ κ°μ²΄κ° μ¬μ© 주체μ΄λ€.
κ΅¬λΆ | μμ | κ° | μ¬μ© 주체 | μ¬μ© λͺ©μ |
prototype | constructor | νλ‘ν νμ μ μ°Έμ‘° | μμ±μ | μμ±μ ν¨μκ° μμ±ν μΈμ€ν΄μ€μ νλ‘ν νμ μ ν λΉ |
__proto__ | λͺ¨λ κ°μ²΄ | νλ‘ν νμ μ μ°Έμ‘° | λͺ¨λ κ°μ²΄ | κ°μ²΄κ° μμ μ νλ‘ν νμ μ μ κ·Ό |
class Person {
constructor(name, favorite) {
this.name = name;
this.favorite = favorite;
}
like() {
console.log(`${this.name}μ ${this.favorite}μ μ’μν©λλ€.`);
}
}
const subin = new Person('μλΉ', 'μ΄νΌμΉ');
μμ κ°μ Person
μ΄λΌλ ν΄λμ€κ° μλ€κ³ νλ©΄
Person.prototype.constructor === Person; // true
Person
μμ±μ λ΄μ κ°μ²΄λ₯Ό μμ±νλ κ²μ Person()
μμ±μμ΄λ€.
μ¦ Person.prototype.constructor
λ class Person { ... }
μ μλ―Ένλ€.
Person.prototype === subin.__proto__; // true
Person
μμ±μ λ΄μ κ°μ²΄λ subin
μΈμ€ν΄μ€μ νλ‘ν νμ
κ³Ό κ°λ€.
μ¦ Person.prototype
κ³Ό subin.__proto__
λ Person
λ΄μ κ°μ²΄μΈ {constructor: f, like: f}
μ μλ―Ένλ€.
Person.prototype.like === subin.like; // true
Person
λ΄μ κ°μ²΄μ subin
λ΄μ κ°μ²΄λ λμΌνλ€.
μ¦ Person.prototype.like
μ subin.like
λ like()
λ©μλλ₯Ό μλ―Ένλ€.
βοΈ νλ‘ν νμ 체μΈ
νλ‘ν νμ 체μΈμ΄λ?
μλ°μ€ν¬λ¦½νΈλ κ°μ²΄μ μμ±κ³Ό λ©μλμ μ κ·Όν λ ν΄λΉ κ°μ²΄μ μ κ·Όνκ³ μ νλ μμ±κ³Ό λ©μλκ° μμ κ²½μ° λΆλͺ¨ μν μ νλ νλ‘ν νμ μ μμ±κ³Ό λ©μλλ₯Ό μμ°¨μ μΌλ‘ κ²μνλ€.
μ΄κ²μ νλ‘ν νμ 체μΈμ΄λΌκ³ νλ€.
class Person {
constructor(name, favorite) {
this.name = name;
this.favorite = favorite;
}
like() {
console.log(`${this.name}μ ${this.favorite}μ μ’μν©λλ€.`);
}
}
const subin = new Person('μλΉ', 'μ΄νΌμΉ');
subin
μ Person
μ μν΄ μμ±λ μΈμ€ν΄μ€μ΄κΈ° λλ¬Έμ Person.prototype
μ λ©μλμΈ like()
λ₯Ό μ¬μ©ν μ μλ€.
μ΄μ²λΌ subin.like()
κ° κ°λ₯ν μ΄μ κ° λ°λ‘ νλ‘ν νμ
체μΈλλ¬Έμ΄λ€.
νλ‘ν νμ
체μΈμ μ΅μμμ μ‘΄μ¬νλ κ°μ²΄λ νμ Object.prototype
μ΄λ€. μ΄λ __proto__
μμ±μ μ΄μ©ν΄μ νμΈν μ μλ€.
subin.__proto__; // Person.prototype
subin.__proto__.__proto__; // Object.prototype
subin.__proto__.__proto__.__proto__; // undefined
subin.__proto__
μ νλ‘ν νμ
μ Person.prototye
μ΄λ€.
Person.prototype
μ νλ‘ν νμ
μ Object.prototype
, μ¦ νλ‘ν νμ
체μΈμ μ’
μ μ΄λ€.
μ¬κΈ°μ .__proto__
λ₯Ό ν λ² λ μ€ννλ©΄ λ μ΄μ __proto__
μμ±μ κ²μν μ μκΈ° λλ¬Έμ undefined
κ° λ°νλλ€.
'πΆ FE 41κΈ° > Review' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[S2U1] JavaScript κ³ μ°¨ ν¨μ (0) | 2022.09.20 |
---|---|
[S1U11] JS/λΈλΌμ°μ DOM (0) | 2022.09.14 |
[S1U10] JavaScript ν΅μ¬ κ°λ κ³Ό μ£Όμ λ¬Έλ² (0) | 2022.09.07 |
[S1U9] JavaScript λ°°μ΄, κ°μ²΄ (0) | 2022.09.05 |
[S1U8] Linux/Git κΈ°μ΄ (0) | 2022.09.01 |