ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Javascript] ํด๋ž˜์Šค์˜ ๋™์ž‘์›๋ฆฌ์™€ ํด๋ž˜์Šค ์ƒ์†(์˜ค๋ฒ„๋ผ์ด๋”ฉ)
    Language/JavaScript 2023. 1. 3. 22:52
    ๐Ÿ“Œ ์ถœ์ฒ˜ : https://ko.javascript.info/class

    ํด๋ž˜์Šค

    ํด๋ž˜์Šค ๋™์ž‘์›๋ฆฌ

    ํ•จ์ˆ˜๋Š” ๊ธฐ๋Šฅ์„ ํฌ์žฅํ•˜๋Š” ๊ธฐ์ˆ ์ด๋ผ๋ฉด, ํด๋ž˜์Šค๋Š” ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜ ์ค‘ ์—ฐ๊ด€์žˆ๋Š” ๊ฒƒ๋“ค์„ ์„ ๋ณ„ํ•ด ํฌ์žฅํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค. ํด๋ž˜์Šค๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๊ฐ์ฒด๋‹จ์œ„๋กœ ์ฝ”๋“œ๋ฅผ ๊ทธ๋ฃนํ™”ํ•˜๊ณ  ์žฌ์‚ฌ์šฉ์ด ์šฉ์ดํ•˜๋‹ค.

    class User {
    	constructor(name) {
    		this.name = name
    	}
    	sayHi() {
    		console.log(this.name)
    	}
    }
    console.log(typeof User) // function

    class User { … } ๋ฌธ๋ฒ• ๊ตฌ์กฐ์˜ ๋™์ž‘ ์›๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

    1. User๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง„ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ ๋‹ค. ํ•จ์ˆ˜ ๋ณธ๋ฌธ์€ ์ƒ์„ฑ์ž ๋ฉ”์„œ๋“œ constructor์—์„œ ๊ฐ€์ ธ์˜จ๋‹ค. ์ƒ์„ฑ์ž ๋ฉ”์„œ๋“œ๊ฐ€ ์—†์œผ๋ฉด ๋ณธ๋ฌธ์ด ๋น„์›Œ์ง„ ์ฑ„๋กœ ํ•จ์ˆ˜๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค.
    2. sayHi ๊ฐ™์€ ํด๋ž˜์Šค ๋‚ด์—์„œ ์ •์˜ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ User.prototype์— ์ €์žฅํ•œ๋‹ค.

    ⇒ new User๋ฅผ ํ˜ธ์ถœํ•ด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ , ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด User ํ•จ์ˆ˜์˜ prototype ํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•ด ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค(User class๊ฐ€ ์ƒ์„ฑํ•œ ์ธ์Šคํ„ด์Šค์˜ ํ”„๋กœํ† ํƒ€์ž…์ด User.prototype์ด๊ธฐ ๋•Œ๋ฌธ!)

    ํด๋ž˜์Šค์™€ ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ์ˆœ์ˆ˜ํ•จ์ˆ˜

    // class User์™€ ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ์ˆœ์ˆ˜ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
    
    // 1. ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
    function User(name) {
      this.name = name;
    }
    // ๋ชจ๋“  ํ•จ์ˆ˜์˜ ํ”„๋กœํ† ํƒ€์ž…์€ 'constructor' ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ๊ฐ–๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—
    // constructor ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
    // ์ฆ‰ User.prototype์„ ์ฝ˜์†”์— ์ฐ์–ด๋ณด๋ฉด constructor ๋ฉ”์„œ๋“œ๊ฐ€ ๋‚ด์žฅ๋˜์–ด์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
    
    // 2. prototype์— ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
    User.prototype.sayHi = function() {
      alert(this.name);
    };
    
    // ์‚ฌ์šฉ๋ฒ•:
    let user = new User("John");
    user.sayHi();
    

    ์œ„์˜ ์˜ˆ์‹œ์ฒ˜๋Ÿผ ์ˆœ์ˆ˜ ํ•จ์ˆ˜๋กœ ํด๋ž˜์Šค ์—ญํ• ์„ ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ class ํ‚ค์›Œ๋“ค๋ฅด ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์˜ ๊ฒฐ๊ณผ๋Š” ๊ฑฐ์˜ ๊ฐ™๋‹ค.

    ํ•˜์ง€๋งŒ ๋‘ ๋ฐฉ๋ฒ•์—๋Š” ์ค‘์š”ํ•œ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

    ํด๋ž˜์Šค vs ์ƒ์„ฑ์ž ํ•จ์ˆ˜

    1. class๋กœ ๋งŒ๋“  ํ•จ์ˆ˜์—” ํŠน์ˆ˜ ๋‚ด๋ถ€ ํ”„๋กœํผํ‹ฐ์ธ [[IsClassConstructor]] : true ๊ฐ€ ์ด๋ฆ„ํ‘œ์ฒ˜๋Ÿผ ๋ถ™๋Š”๋‹ค. ์ด๊ฒƒ๋งŒ์œผ๋กœ๋„ ๋‘ ๋ฐฉ๋ฒ•์—” ๋ถ„๋ช…ํžˆ ์ฐจ์ด๊ฐ€ ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋‹ค์–‘ํ•œ ๊ฒฝ์šฐ์— ์ด๋ฅผ ํ™œ์šฉํ•œ๋‹ค. ํด๋ž˜์Šค ์ƒ์„ฑ์ž๋ฅผ new์™€ ํ•จ๊ป˜ ํ˜ธ์ถœํ•˜์ง€ ์•Š์œผ๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”๋ฐ ์ด ๋•Œ [[IsClassConstructor]] : true ๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค. ๋˜ํ•œ ํด๋ž˜์Šค ์ƒ์„ฑ์ž๋ฅผ ๋ฌธ์ž์—ด๋กœ ํ˜•๋ณ€ํ™˜ ํ•˜๋ฉด ‘class’๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ฌธ์ž์—ด์ด ๋˜๋Š”๋ฐ ์ด๋•Œ๋„ [[IsClassConstructor]] : true ๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค.
    2. class User { constructor() {} } console.log(typeof User); // User์˜ ํƒ€์ž…์€ ํ•จ์ˆ˜์ด๊ธด ํ•˜์ง€๋งŒ ๊ทธ๋ƒฅ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. User(); // TypeError: Class constructor User cannot be invoked without 'new' console.log(User); // class User { ... }
    3. ํด๋ž˜์Šค์— ์ •์˜๋œ ๋ฉ”์„œ๋“œ๋“ค์€ ์—ด๊ฑฐํ•  ์ˆ˜ ์—†๋‹ค(non-enumerable). ํด๋ž˜์Šค์˜ prototype ํ”„๋กœํผํ‹ฐ์— ์ถ”๊ฐ€๋œ ๋ฉ”์„œ๋“œ์˜ enumerable ํ”Œ๋ž˜๊ทธ๋Š” false์ด๋‹ค. for-in์œผ๋กœ ๊ฐ์ฒด๋ฅผ ์ˆœํšŒํ•  ๋•Œ ๋ฉ”์„œ๋“œ๋Š” ์ˆœํšŒ์˜ ๋Œ€์ƒ์—์„œ ์ œ์™ธํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ์ด ํŠน์ง•์ด ๊ฝค ์œ ์šฉํ•˜๋‹ค.
    4. ํด๋ž˜์Šค๋Š” ํ•ญ์ƒ ์—„๊ฒฉ๋ชจ๋“œ๋กœ ์‹คํ–‰๋œ๋‹ค.(use strict)

    ํด๋ž˜์Šค ์ƒ์†

    extends ํ‚ค์›Œ๋“œ

    class Animal {
      constructor(name) {
        this.speed = 0;
        this.name = name;
      }
      run(speed) {
        this.speed = speed;
        alert(`${this.name} ์€/๋Š” ์†๋„ ${this.speed}๋กœ ๋‹ฌ๋ฆฝ๋‹ˆ๋‹ค.`);
      }
      stop() {
        this.speed = 0;
        alert(`${this.name} ์ด/๊ฐ€ ๋ฉˆ์ท„์Šต๋‹ˆ๋‹ค.`);
      }
    }
    
    let animal = new Animal("๋™๋ฌผ");
    
    class Rabbit extends Animal {
      hide() {
        alert(`${this.name} ์ด/๊ฐ€ ์ˆจ์—ˆ์Šต๋‹ˆ๋‹ค!`);
      }
    }
    
    let rabbit = new Rabbit("ํฐ ํ† ๋ผ");
    
    rabbit.run(5); // ํฐ ํ† ๋ผ ์€/๋Š” ์†๋„ 5๋กœ ๋‹ฌ๋ฆฝ๋‹ˆ๋‹ค.
    rabbit.hide(); // ํฐ ํ† ๋ผ ์ด/๊ฐ€ ์ˆจ์—ˆ์Šต๋‹ˆ๋‹ค!
    

    ํด๋ž˜์Šค Rabbit์„ ์‚ฌ์šฉํ•ด ๋งŒ๋“  ๊ฐ์ฒด๋Š” rabbit.hide() ๊ฐ™์€ Rabbit์— ์ •์˜๋œ ๋ฉ”์„œ๋“œ์—๋„ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ณ  rabbit.run()๊ฐ™์€ Animal์— ์ •์˜๋œ ๋ฉ”์„œ๋“œ์—๋„ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

    ์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ ์ด์œ ๋Š” ํ‚ค์›Œ๋“œ extends ๋•Œ๋ฌธ์ธ๋ฐ, ํ‚ค์›Œ๋“œ extends๋Š” ํ”„๋กœํ† ํƒ€์ž…์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค. extends๋Š” Rabbit.prototype.[[Prototype]]์„ Animal.prototype์œผ๋กœ ์„ค์ •ํ•œ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— Rabbit.prototype์—์„œ ๋ฉ”์„œ๋“œ๋ฅผ ์ฐพ์ง€ ๋ชปํ•˜๋ฉด Animal.Prototype์—์„œ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

    ๋ฉ”์†Œ๋“œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ

    ํŠน๋ณ„ํ•œ ์‚ฌํ•ญ์ด ์—†์œผ๋ฉด class Rabbit์€ class Animal์— ์žˆ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ๊ทธ๋Œ€๋กœ ์ƒ์†๋ฐ›๋Š”๋‹ค.

    ๊ทธ๋Ÿฐ๋ฐ Rabbit์—์„œ stop()๋“ฑ์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์ž์ฒด์ ์œผ๋กœ ์ •์˜ํ•˜๋ฉด, ์ƒ์†๋ฐ›์€ ๋ฉ”์†Œ๋“œ๊ฐ€ ์•„๋‹Œ ์ž์ฒด ๋ฉ”์†Œ๋“œ๊ฐ€ prototype ํ”„๋กœํผํ‹ฐ์— ์„ค์ •๋œ๋‹ค.

    ์ด๋•Œ ๋งŒ์•ฝ, ๋ถ€๋ชจ(Animal) ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ† ๋Œ€๋กœ ์ผ๋ถ€ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•ด์•ผ ํ•  ๊ฒฝ์šฐ ์“ฐ์ด๋Š” ๊ฒƒ์ด ๋ฉ”์†Œ๋“œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์ด๋‹ค.

    • ๋ฉ”์†Œ๋“œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ : ์ƒ์† ๊ด€๊ณ„์— ์žˆ๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค์—์„œ ์ด๋ฏธ ์ •์˜๋œ ๋ฉ”์†Œ๋“œ๋ฅผ ์ž์‹ ํด๋ž˜์Šค์—์„œ ๊ฐ™์€ ์‹œ๊ทธ๋‹ˆ์ณ๋ฅผ ๊ฐ–๋Š” ๋ฉ”์†Œ๋“œ๋กœ ๋‹ค์‹œ ์ •์˜ํ•˜๋Š” ๊ฒƒ

    cf) ์˜ค๋ฒ„๋กœ๋”ฉ : ์˜ค๋ฒ„๋กœ๋”ฉ๊ณผ ํ—ท๊ฐˆ๋ฆด ์ˆ˜ ์žˆ๋Š”๋ฐ ์˜ค๋ฒ„๋กœ๋”ฉ์€ ์„œ๋กœ ๋‹ค๋ฅธ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ๊ฐ–๋Š” ์—ฌ๋Ÿฌ ๋ฉ”์†Œ๋“œ๋ฅผ ํ•˜๋‚˜์˜ ์ด๋ฆ„์œผ๋กœ ์ •์˜ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

    ๋ฉ”์†Œ๋“œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์„ ํ• ๋•Œ๋Š” super ๋ผ๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

    • super.method(…)๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค์— ์ •์˜๋œ ๋ฉ”์†Œ๋“œ method๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
    • super(…)๋Š” ๋ถ€๋ชจ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜๋Š”๋ฐ, ์ž์‹ ์ƒ์„ฑ์ž ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    class Animal {
    
      constructor(name) {
        this.speed = 0;
        this.name = name;
      }
    
      run(speed) {
        this.speed = speed;
        alert(`${this.name}๊ฐ€ ์†๋„ ${this.speed}๋กœ ๋‹ฌ๋ฆฝ๋‹ˆ๋‹ค.`);
      }
    
      stop() {
        this.speed = 0;
        alert(`${this.name}๊ฐ€ ๋ฉˆ์ท„์Šต๋‹ˆ๋‹ค.`);
      }
    
    }
    
    class Rabbit extends Animal {
      hide() {
        alert(`${this.name}๊ฐ€ ์ˆจ์—ˆ์Šต๋‹ˆ๋‹ค!`);
      }
    
      **stop() {
        super.stop(); // ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ stop์„ ํ˜ธ์ถœํ•ด ๋ฉˆ์ถ”๊ณ ,
        this.hide(); // ์ˆจ์Šต๋‹ˆ๋‹ค.
      }**
    }
    
    let rabbit = new Rabbit("ํฐ ํ† ๋ผ");
    
    rabbit.run(5); // ํฐ ํ† ๋ผ๊ฐ€ ์†๋„ 5๋กœ ๋‹ฌ๋ฆฝ๋‹ˆ๋‹ค.
    rabbit.stop(); // ํฐ ํ† ๋ผ๊ฐ€ ๋ฉˆ์ท„์Šต๋‹ˆ๋‹ค. ํฐ ํ† ๋ผ๊ฐ€ ์ˆจ์—ˆ์Šต๋‹ˆ๋‹ค!
    

    ์ƒ์„ฑ์ž ์˜ค๋ฒ„๋ผ์ด๋”ฉ

    ์œ„์˜ ์˜ˆ์‹œ์— ๋”ฐ๋ฅด๋ฉด, Rabbit์— ์ž์ฒด constructor๊ฐ€ ์—†๋‹ค.

    ์ด์ฒ˜๋Ÿผ ํด๋ž˜์Šค๊ฐ€ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›๊ณ  constructor๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ์•„๋ž˜์ฒ˜๋Ÿผ “๋น„์–ด์žˆ๋Š”” constructor๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค. rabbit ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ๋•Œ ์ƒ์„ฑ์ž๋กœ “ํฐ ํ† ๋ผ”๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ์ด์œ ์ด๋‹ค.

    class Rabbit extends Animal {
      // ์ž์ฒด ์ƒ์„ฑ์ž๊ฐ€ ์—†๋Š” ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์œผ๋ฉด ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด์ง
      constructor(...args) {
        super(...args);
      }
    }
    

    ์ด์ œ Rabbit์— ์ปค์Šคํ…€ ์ƒ์„ฑ์ž๋ฅผ ์ถ”๊ฐ€ํ•ด๋ณด์ž.

    ์ปค์Šคํ…€ ์ƒ์„ฑ์ž์—์„œ name๊ณผ earLength๋ฅผ ์ง€์ •ํ•˜๋ฉด,

    class Animal {
      constructor(name) {
        this.speed = 0;
        this.name = name;
      }
      // ...
    }
    
    class Rabbit extends Animal {
    
      constructor(name, earLength) {
        this.speed = 0;
        this.name = name;
        this.earLength = earLength;
      }
    
      // ...
    }
    
    // ๋™์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค!
    let rabbit = new Rabbit("ํฐ ํ† ๋ผ", 10); // ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor
    

    ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

    ๊ทธ ์ด์œ ๋Š”, ์ƒ์† ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž์—์„œ๋Š” ๋ฐ˜๋“œ์‹œ super(…)๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์ด๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š์•„ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒƒ์ด๋‹ค. super(…)๋Š” this๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๋ฐ˜๋“œ์‹œ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค.

    ๊ทธ๋Ÿฐ๋ฐ ์™œ super(…)๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ• ๊นŒ?

    ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ‘์ƒ์† ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž ํ•จ์ˆ˜(derived constructor)’์™€ ๊ทธ๋ ‡์ง€ ์•Š์€ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ๊ตฌ๋ถ„ํ•œ๋‹ค. ์ƒ์† ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž ํ•จ์ˆ˜์—” ํŠน์ˆ˜ ๋‚ด๋ถ€ ํ”„๋กœํผํ‹ฐ์ธ [[ConstructorKind]]:”drived” ๊ฐ€ ์ด๋ฆ„ํ‘œ์ฒ˜๋Ÿผ ๋ถ™๋Š”๋‹ค.

    ์ผ๋ฐ˜ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž ํ•จ์ˆ˜์™€ ์ƒ์† ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๊ฐ„ ์ฐจ์ด๋Š” new์™€ ํ•จ๊ป˜ ๋“œ๋Ÿฌ๋‚œ๋‹ค.

    • ์ผ๋ฐ˜ ํด๋ž˜์Šค๊ฐ€ new์™€ ํ•จ๊ป˜ ์‹คํ–‰๋˜๋ฉด ๋นˆ ๊ฐ์ฒด๊ฐ€ ๋งŒ๋“ค์–ด์ง€๊ณ  this์— ์ด ๊ฐ์ฒด๋ฅผ ๋ฐ”์ธ๋”ฉํ•œ๋‹ค.
    • ๋ฐ˜๋ฉด, ์ƒ์† ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋ฉด, ์ผ๋ฐ˜ ํด๋ž˜์Šค์• ์„œ ์ผ์–ด๋‚œ ์ผ์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค. ์ƒ์† ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋Š” ๋นˆ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  this์— ์ด ๊ฐ์ฒด๋ฅผ ํ• ๋‹นํ•˜๋Š” ์ผ์„ ๋ถ€๋ชจ์˜ ํด๋ž˜์Šค ์ƒ์„ฑ์ž๊ฐ€ ์ฒ˜๋ฆฌํ•˜๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•œ๋‹ค.

    ์กฐ๊ธˆ ๋” ์ž์„ธํžˆ ๋ณด์ž๋ฉด

    ๐Ÿ“Œ ์ถœ์ฒ˜ : https://velog.io/@dnr6054/deepdive-constructor

    ์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ๊ณผ์ •

    ์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ ์—ญํ• ์€ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ๊ณผ ์ƒ์„ฑ๋œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ดˆ๊ธฐํ™”(์ธ์Šคํ„ด์Šค ํ”„๋กœํผํ‹ฐ ์ถ”๊ฐ€ ๋ฐ ์ดˆ๊ธฐ๊ฐ’ ํ• ๋‹น)ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

    // ์ƒ์„ฑ์ž ํ•จ์ˆ˜
    function Circle(radius) {
      // ์ธ์Šคํ„ด์Šค ์ดˆ๊ธฐํ™”
      this.radius = radius;
      this.getDiameter = function () {
        return 2 * this.radius; 
      };
    }
    
    // ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
    const circle1 = new Circle(5); // ๋ฐ˜์ง€๋ฆ„์ด 5์ธ Circle ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ
    

    ์ด ์ฝ”๋“œ์—์„œ๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•˜๋Š” ์ฝ”๋“œ๋Š” ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด ์•”๋ฌต์ ์ธ ์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•ด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

    1. ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ๊ณผ this ๋ฐ”์ธ๋”ฉ
      ์•”๋ฌต์ ์œผ๋กœ ๋นˆ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์•”๋ฌต์ ์œผ๋กœ ์ƒ์„ฑ๋œ ๋นˆ ๊ฐ์ฒด, ์ฆ‰ ์ธ์Šคํ„ด์Šค๋Š” this์— ๋ฐ”์ธ๋”ฉ๋œ๋‹ค. ์ด ์ฒ˜๋ฆฌ๋Š” ํ•จ์ˆ˜ ๋ชธ์ฒด์˜ ์ฝ”๋“œ๊ฐ€ ํ•œ ์ค„์”ฉ ์‹คํ–‰๋˜๋Š” ๋Ÿฐํƒ€์ž„ ์ด์ „์— ์‹คํ–‰๋œ๋‹ค.
    2. ์ธ์Šคํ„ด์Šค ์ดˆ๊ธฐํ™”
      ์ƒ์„ฑ์ž ํ•จ์ˆ˜์— ๊ธฐ์ˆ ๋˜์–ด ์žˆ๋Š” ์ฝ”๋“œ๊ฐ€ ํ•œ ์ค„์”ฉ ์‹คํ–‰๋˜์–ด this์— ๋ฐ”์ธ๋”ฉ ๋˜์–ด ์žˆ๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค. ์ฆ‰, this์— ๋ฐ”์ธ๋”ฉ๋˜์–ด ์žˆ๋Š” ์ธ์Šคํ„ด์Šค์— ํ”„๋กœํผํ‹ฐ๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์€ ์ดˆ๊ธฐ๊ฐ’์„ ์ธ์Šคํ„ด์Šค ํ”„๋กœํผํ‹ฐ์— ํ• ๋‹นํ•˜์—ฌ ์ดˆ๊ธฐํ™”ํ•˜๊ฑฐ๋‚˜ ๊ณ ์ •๊ฐ’์„ ํ• ๋‹นํ•œ๋‹ค.
    3. ์ธ์Šคํ„ด์Šค ๋ฐ˜ํ™˜
      ์ƒ์„ฑ์ž ๋‚ด๋ถ€์˜ ๋ชจ๋“  ์ฒ˜๋ฆฌ๊ฐ€ ๋๋‚˜๋ฉด ์™„์„ฑ๋œ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฐ”์ธ๋”ฉ ๋œ this๊ฐ€ ์•”๋ฌต์ ์œผ๋กœ ๋ฐ˜ํ™˜๋œ๋‹ค.
    function Circle(radius) {
      // 1. ์•”๋ฌต์ ์œผ๋กœ ๋นˆ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  this์— ๋ฐ”์ธ๋”ฉ๋œ๋‹ค.
      
      // 2. this์— ๋ฐ”์ธ๋”ฉ๋˜์–ด ์žˆ๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.
      this.radius = radius;
      this.getDiameter = function () {
        return 2 * this.radius; 
      };
      
      // 3. ์™„์„ฑ๋œ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฐ”์ธ๋”ฉ๋œ this๊ฐ€ ์•”๋ฌต์ ์œผ๋กœ ๋ฐ˜ํ™˜๋œ๋‹ค.
    }
    
    // ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ. Circle ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋Š” ์•”๋ฌต์ ์œผ๋กœ this๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    const circle1 = new Circle(5);
    console.log(circle); // Circle {radius: 1, getDiameter: f}
    

    ๋‹ค์‹œ ๋Œ์•„์™€์„œ,

    ์ด๋Ÿฌํ•œ ์ฐจ์ด ๋•Œ๋ฌธ์— ์ƒ์† ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž์—์„  super๋ฅผ ํ˜ธ์ถœํ•ด ๋ถ€๋ชจ ์ƒ์„ฑ์ž๋ฅผ ์‹คํ–‰ํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด this๊ฐ€ ๋  ๊ฐ์ฒด๊ฐ€ ๋งŒ๋“ค์–ด์ง€์ง€ ์•Š์•„์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์•„๋ž˜ ์˜ˆ์‹œ์™€ ๊ฐ™์ด this ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— super() ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด Rabbit ์˜ ์ƒ์„ฑ์ž๊ฐ€ ์ œ๋Œ€๋กœ ๋™์ž‘ํ•œ๋‹ค.

    class Animal {
    
      constructor(name) {
        this.speed = 0;
        this.name = name;
      }
    
      // ...
    }
    
    class Rabbit extends Animal {
    
      constructor(name, earLength) {
        super(name);
        this.earLength = earLength;
      }
    
      // ...
    }
    
    // ์ด์ œ ์—๋Ÿฌ ์—†์ด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
    let rabbit = new Rabbit("ํฐ ํ† ๋ผ", 10);
    alert(rabbit.name); // ํฐ ํ† ๋ผ
    alert(rabbit.earLength); // 10
    

     

    • ์ธ์Šคํ„ด์Šค
      ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ผ๋ฐ˜์ ์œผ๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค. ์ฆ‰, ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋กœ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•œ๋‹ค!(์žฌ์‚ฌ์šฉ)
    • ๊ฐ์ฒด
      ์ธ์Šคํ„ด์Šค์˜ ๋‹ค๋ฅธ๋ง๋กœ, ๋‘˜ ๋‹ค ํด๋ž˜์Šค์˜ ์‹ค์ฒด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ง์ด๋‹ค. ๋ณดํ†ต ํด๋ž˜์Šค๋ฅผ ๊ฑฐํ‘ธ์ง‘์— ๋น„์œ ํ•˜๋Š”๋ฐ ๊ฐ์ฒด์™€ ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ทธ ๊ฑฐํ‘ธ์ง‘์œผ๋กœ ๋งŒ๋“ค์–ด๋‚ธ “์‹ค์ฒด”๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ๊ฐ์ฒด์™€ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„ํ•˜์ž๋ฉด, ์ธ์Šคํ„ด์Šค๋Š” new ํ‚ค์›Œ๋“œ๋กœ ํด๋ž˜์Šค์˜ ์‹ค์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์šฉ์–ด์ด๊ณ , ๊ฐ์ฒด๋Š” ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ํ›„ ํด๋ž˜์Šค์—์„œ ์ œ๊ณตํ•˜๋Š” ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์šฉ์–ด์ด๋‹ค.
    • ํ”„๋กœํผํ‹ฐ
      ํด๋ž˜์Šค ๋‚ด๋ถ€์— ๋งŒ๋“œ๋Š” ๋ณ€์ˆ˜(๋ฉค๋ฒ„๋ณ€์ˆ˜)๋ฅผ ํ”„๋กœํผํ‹ฐ๋ผ๊ณ  ํ•œ๋‹ค. ํ”„๋กœํผํ‹ฐ์—๋Š” ์ฃผ๋กœ ๊ฐ์ฒด ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ์ •๋ณด์™€ ๊ฐ์ฒด ๋‚ด๋ถ€ ํ•จ์ˆ˜(๋ฉ”์„œ๋“œ)์—์„œ ์ฒ˜๋ฆฌํ•œ ๊ฒฐ๊ณผ ๊ฐ’์ด ์ €์žฅ๋œ๋‹ค.
    • ๋ฉ”์„œ๋“œ
      ํด๋ž˜์Šค ๋‚ด๋ถ€์— ์„ ์–ธํ•œ ํ•จ์ˆ˜๋ฅผ ๋ฉ”์„œ๋“œ๋ผ๊ณ  ํ•˜๋ฉฐ ๋ฉค๋ฒ„ํ•จ์ˆ˜๋ผ๊ณ ๋„ ๋ถ€๋ฅธ๋‹ค. ๋ฉ”์„œ๋“œ๋Š” ์ฃผ๋กœ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ๋ณ€๊ฒฝ(setter)ํ•˜๊ฑฐ๋‚˜ ์•Œ์•„๋‚ด๋Š” ๊ธฐ๋Šฅ(getter), ํด๋ž˜์Šค๋ฅผ ๋Œ€ํ‘œํ•˜๋Š” ๊ธฐ๋Šฅ ๋“ฑ์ด ๋‹ด๊ธด๋‹ค.

    ๋Œ“๊ธ€