Dream🐰ng
article thumbnail

 

객체 μ§€ν–₯


객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°μ΄λž€?

ν•˜λ‚˜μ˜ 청사진을 λ§Œλ“€κ³ 
κ·Έ 청사진을 λ°”νƒ•μœΌλ‘œ, 즉 μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” 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κ°€ λ°˜ν™˜λœλ‹€.

profile

Dream🐰ng

@shoupeach

🐰 Happy new rabbit! 🐰

profile on loading

Loading...