Skip to content

Latest commit

ย 

History

History
439 lines (339 loc) ยท 18.6 KB

class.md

File metadata and controls

439 lines (339 loc) ยท 18.6 KB

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ํด๋ž˜์Šค ๊ธฐ๋ฐ˜์˜ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๊ฐ€ ์•„๋‹ˆ์ง€๋งŒ ํ”„๋กœํ† ํƒ€์ž… ๊ธฐ๋ฐ˜์˜ ์•„์ฃผ ์œ ์—ฐํ•œ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์Šคํƒ€์ผ๋กœ ๊ฐ์ฒด ์ง€ํ–ฅ ์–ธ์–ด์˜ ์ƒ์†๊ณผ ์บก์Šํ™” ๋“ฑ์˜ ์ถ”์ƒ์  ๊ฐœ๋…๋„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด ์žฅ์—์„œ ES6์— ๋“ฑ์žฅํ•œ ํด๋ž˜์Šค(Class)์— ๋Œ€ํ•ด ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

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

ES6์˜ ํด๋ž˜์Šค๊ฐ€ ํ”„๋กœํ† ํƒ€์ž… ๊ธฐ๋ฐ˜ ๊ฐ์ฒด ์ง€ํ–ฅ ๋ชจ๋ธ์„ ํ์ง€ํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ํด๋ž˜์Šค๋„ ํ•จ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์ด์ง€์š”.

์šฐ๋ฆฌ๋Š” ๊ธฐ์กด ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๊ตฌํ˜„ํ•  ๋•Œ, ์ƒ์„ฑ์ž ํ•จ์ˆ˜์™€ ํ”„๋กœํ† ํƒ€์ž…, ํด๋กœ์ €๋ฅผ ์ด์šฉํ•ด์™”์Šต๋‹ˆ๋‹ค.

var Person = (function () {
  // Constructor, ์ƒ์„ฑ์ž ํ•จ์ˆ˜
  function Person(name) {
    this._name = name;
  }

  // public method
  Person.prototype.sayHi = function () {
    console.log('HELLO! ' + this._name);
  };

  // return constructor
  return Person;
}());

// ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
var me = new Person('Amy');
me.sayHi();                        // HELLO! Amy

console.log(me instanceof Person); // true

์ด๋ฅผ ํด๋ž˜์Šค๋กœ ๊ตฌํ˜„ํ•ด๋ณผ๊นŒ์š”?

class Person {
  // constructor, ์ƒ์„ฑ์ž
  constructor(name) {
    this._name = name;
  }

  sayHi() {
    console.log(`HELLO! ${this._name}`);
  }
}

// ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
const me = new Person('Amy');
me.sayHi();                        // HELLO! Amy

console.log(me instanceof Person); // true

๋™์ผํ•œ ๋™์ž‘์„ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ฃ ? ๊ตฌ๋ฌธ๋„ ๋‹จ์ˆœํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ES6์˜ ํด๋ž˜์Šค๋Š” ํ•จ์ˆ˜์ด๋ฉฐ ๊ธฐ์กด ํ”„๋กœํƒ€์ž… ๊ธฐ๋ฐ˜ ํŒจํ„ด์— ๋ฌธ๋ฒ•์  ์„คํƒ•(Syntactic sugar) ์ด ๋ฉ๋‹ˆ๋‹ค. ๋‹จ, ํด๋ž˜์Šค์™€ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•˜์ง€๋Š” ์•Š์œผ๋‹ˆ๊นŒ ์ฃผ์˜(์ผ๊ฐ์—์„  ์ด๋Ÿฐ ์ด์œ ๋กœ ํด๋ž˜์Šค๋ฅผ ๋ฌธ๋ฒ•์  ์„คํƒ•์œผ๋กœ ์ธ์ •ํ•˜์ง€ ์•Š์•„์š”)ํ•˜์„ธ์š”.


ํด๋ž˜์Šค ์ •์˜

ํด๋ž˜์Šค๋Š” class ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •์˜ํ•˜๋ฉฐ, ํŒŒ์Šค์นผ ์ผ€์ด์Šค๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค.

ํด๋ž˜์Šค๋ฅผ ์–ด๋–ป๊ฒŒ ์ž‘์„ฑํ•˜๋Š”์ง€๋Š” ์–ธ๊ธ‰ํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด ํ”„๋กœํ† ํƒ€์ž…๊ณผ ์œ ์‚ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ด์ฃ . ์ด ์žฅ์—์„œ๋Š” ํด๋ž˜์Šค์˜ ํŠน์ง•๋งŒ ์งš๊ณ  ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค.

  1. ํด๋ž˜์Šค๋Š” ํด๋ž˜์Šค ์„ ์–ธ๋ฌธ ์ด์ „์— ์ฐธ์กฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
    • ์ด๋Š” let, const์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ฆ‰, ํ˜ธ์ด์ŠคํŒ…๋˜๋‚˜ let, const ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ์„ ์–ธ๋ฌธ ์ด์ „์— ์ผ์‹œ์  ์‚ฌ๊ฐ์ง€๋Œ€(TDZ)์— ๋น ์ง€๊ธฐ ๋•Œ๋ฌธ์ด์ฃ .
    • ํ˜ธ์ด์ŠคํŒ…์€ var, let, const, function, function*, class ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ ๋ชจ๋“  ์„ ์–ธ๋ฌธ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

  1. ํ‘œํ˜„์‹์œผ๋กœ๋„ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ต๋ช…์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    const NamedClass = class UnNamedClass {};
    
    const name = new NamedClass();
    console.log(name);  // UnNamedClass {}
    
    new UnNamedClass(); // ReferenceError: UnNamedClass is not defined
    • ํด๋ž˜์Šค๊ฐ€ ํ• ๋‹น๋œ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๊ธฐ๋ช… ํด๋ž˜์Šค๋กœ ์ƒ์„ฑํ•œ๋‹ค๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” ํด๋ž˜์Šค ํ‘œํ˜„์‹์— ์‚ฌ์šฉํ•œ ์ด๋ฆ„์€ ์™ธ๋ถ€ ์ฝ”๋“œ์—์„œ ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ด์ฃ .

  1. ์ƒ์„ฑ์ž ํ•จ์ˆ˜์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ new ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ํด๋ž˜์Šค๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
    class NamedClass {};
    const name = NamedClass(); // TypeError: Class constructor NamedClass cannot be invoked without 'new'
    • ํด๋ž˜์Šค๋ฅผ new ์—ฐ์‚ฐ์ž ์—†์ด ํ˜ธ์ถœํ•˜๋ฉด ํƒ€์ž… ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

  1. ํด๋ž˜์Šค๋Š” ํด๋ž˜์Šค ๋‚ด๋ถ€์˜ ์บก์Šํ™”๋œ ๋ณ€์ˆ˜, ํด๋ž˜์Šค ํ•„๋“œ(Class Field) ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.
    • ๋ฐ์ดํ„ฐ ๋ฉค๋ฒ„, ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ผ๊ณ ๋„ ๋ถ€๋ฅด๋ฉฐ ์ธ์Šคํ„ด์Šค์˜ ํ”„๋กœํผํ‹ฐ ํ˜น์€ ์ •์  ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • this์— ์ถ”๊ฐ€ํ•œ ํ”„๋กœํผํ‹ฐ๋ฅผ ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด์—์„œ ํด๋ž˜์Šค ํ•„๋“œ๋ผ๊ณ  ์ง€์นญํ•˜์ฃ .

  1. constructor๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํด๋ž˜์Šค ํ•„๋“œ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค.
    class NamedClass {};
    const name = NamedClass(); // TypeError: Class constructor NamedClass cannot be invoked without 'new'
    // NamedClass๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜(constructor)์ž…๋‹ˆ๋‹ค.
    console.log(Object.getPrototypeOf(name).constructor === NamedClass); // true
    • new ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์ด constructor๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ์— ์ „๋‹ฌํ•œ ๊ฐ’์€ ํด๋ž˜์Šค ํ•„๋“œ์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • constructor๋Š” ์ธ์Šคํ„ด์Šค์˜ ์ƒ์„ฑ๊ณผ ๋™์‹œ์— ํด๋ž˜์Šค ํ•„๋“œ์˜ ์ƒ์„ฑ๊ณผ ์ดˆ๊ธฐํ™”๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    • constructor๋Š” ํด๋ž˜์Šค ๋‚ด์— ํ•œ ๊ฐœ๋งŒ ์กด์žฌํ•˜๋ฉฐ 2๊ฐœ ์ด์ƒ์ผ ๊ฒฝ์šฐ ๋ฌธ๋ฒ• ์—๋Ÿฌ(SyntaxError)๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
    • constructor๋ฅผ ์ƒ๋žตํ•˜๋ฉด ํด๋ž˜์Šค์— constructor() {}, ์ฆ‰ ๋นˆ ๊ฐ์ฒด๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

  1. ํด๋ž˜์Šค ํ•„๋“œ์—๋Š” ๋ฉ”์„œ๋“œ๋งŒ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    class NamedClass {
      name = ''; // SyntaxError
    
      // ํด๋ž˜์Šค ํ•„๋“œ์˜ ์„ ์–ธ๊ณผ ์ดˆ๊ธฐํ™”๋Š” ๋ฐ˜๋“œ์‹œ constructor์—์„œ ์‹ค์‹œํ•ฉ๋‹ˆ๋‹ค.
      constructor(name) {
        this.name = name;
      }
    }

    ํ˜„์žฌ๋Š” ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š”๋ฐ, TC39 ํ”„๋กœ์„ธ์Šค์˜ stage 3(candidate) ๋‹จ๊ณ„์— ์žˆ๋Š” ํด๋ž˜์Šค ๋ชธ์ฒด์—์„œ ์ง์ ‘ ์ธ์Šคํ„ด์Šค ํ•„๋“œ๋ฅผ ์„ ์–ธํ•˜๊ณ  private ์ธ์Šคํ„ด์Šค ํ•„๋“œ๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœํฌ์ ˆ(Class field declarations proposal)์˜ ํ•„๋“œ ์ •์˜๋ฅผ ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ €์™€ ์ตœ์‹  Node.js๊ฐ€ ๊ตฌํ˜„ํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.


    • constructor ๋‚ด๋ถ€์—์„œ ์„ ์–ธํ•œ ํด๋ž˜์Šค ํ•„๋“œ๋Š” ํด๋ž˜์Šค๊ฐ€ ์ƒ์„ฑํ•  ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” this์— ๋ฐ”์ธ๋”ฉ๋˜๋ฉฐ, ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค๋ฅผ ํ†ตํ•ด ์™ธ๋ถ€์—์„œ ์ง์ ‘ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. publicํ•œ ๋ฉค๋ฒ„๋กœ์„œ ์ทจ๊ธ‰๋˜๋Š” ๊ฒƒ์ด์ฃ .

    ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ €์™€ Node.js 12๋ฒ„์ „ ์ด์ƒ์—์„œ๋Š” ์—ฌ๋Ÿฌ ์†์„ฑ๋“ค์„ ์ง€์›ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์—ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ•ด์ฃผ์„ธ์š”.


  1. getter/setter๋กœ ํด๋ž˜์Šค ํ•„๋“œ์˜ ๊ฐ’์„ ์ฐธ์กฐํ•˜๊ฑฐ๋‚˜, ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์šฐ๋ฆฌ๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” ๊ทธ ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋งž์Šต๋‹ˆ๋‹ค.

  1. ์ •์ (static) ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค๊ฐ€ ์•„๋‹ˆ๋ผ ํด๋ž˜์Šค ์ด๋ฆ„์œผ๋กœ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ •์  ๋ฉ”์„œ๋“œ์— this๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
    class NamedClass {
      constructor(prop) {
        this.prop = prop;
      }
    
      static staticMethod() {
        // ์ •์  ๋ฉ”์„œ๋“œ๋Š” this๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
        // ์ •์  ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ this๋Š” ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์•„๋‹Œ ํด๋ž˜์Šค ์ž์‹ ์„ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.
        return 'staticMethod';
      }
    
      prototypeMethod() {
        return this.prop;
      }
    }
    
    // ์ •์  ๋ฉ”์„œ๋“œ๋Š” ํด๋ž˜์Šค ์ด๋ฆ„์œผ๋กœ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
    console.log(NamedClass.staticMethod());
    
    const name = new NamedClass(123);
    // ์ •์  ๋ฉ”์„œ๋“œ๋Š” ์ธ์Šคํ„ด์Šค๋กœ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
    console.log(name.staticMethod()); // Uncaught TypeError: NamedClass.staticMethod is not a function
    • ์ด์œ ๋Š” ๊ธฐ์กด ํ”„๋กœํ† ํƒ€์ž… ๊ธฐ๋ฐ˜์˜ ๋ฌธ๋ฒ•์  ์„คํƒ•์ด ํด๋ž˜์Šค์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์œ„ ์˜ˆ์ œ๋ฅผ ES5๋กœ ํ‘œํ˜„ํ•ด ๋ณผ๊นŒ์š”?
      var NamedClass = (function () {
        // ์ƒ์„ฑ์ž ํ•จ์ˆ˜
        function NamedClass(prop) {
          this.prop = prop;
        }
      
        NamedClass.staticMethod = function () {
          return 'staticMethod';
        };
      
        NamedClass.prototype.prototypeMethod = function () {
          return this.prop;
        };
      
        return NamedClass;
      }());
      
      var name = new NamedClass(123);
      console.log(name.prototypeMethod());    // 123
      console.log(NamedClass.staticMethod()); // staticMethod
      console.log(name.staticMethod());       // Uncaught TypeError: name.staticMethod is not a function
    • prototype ํ”„๋กœํผํ‹ฐ๋Š” ํ•จ์ˆ˜ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ์ž๋กœ ์‚ฌ์šฉ๋  ๋•Œ, ์ด ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ๋œ ๊ฐ์ฒด์˜ ๋ถ€๋ชจ ์—ญํ• ์„ ํ•˜๋Š” ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋ฏ€๋กœ ์ •์  ๋ฉ”์„œ๋“œ์ธ staticMethod๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜ NamedClass์˜ ๋ฉ”์„œ๋“œ(ํ•จ์ˆ˜๋Š” ๊ฐ์ฒด์ด๋ฏ€๋กœ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์–ด์š”)์ด๊ณ , ์ผ๋ฐ˜ ๋ฉ”์„œ๋“œ์ธ prototypeMethod๋Š” ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด NamedClass.prototype์˜ ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ staticMethod๋Š” name์—์„œ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์ด์ฃ !

  1. extends ํ‚ค์›Œ๋“œ๋กœ ํด๋ž˜์Šค๋ฅผ ์ƒ์†(Class Inheritance) ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์˜ค๋ฒ„๋ผ์ด๋”ฉ(Overriding), ์˜ค๋ฒ„๋กœ๋”ฉ(Overloading)์ด ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์— ์˜ํ•ด ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • super() ํ‚ค์›Œ๋“œ๋กœ ๋ถ€๋ชจ ํด๋ž˜์Šค๋ฅผ ์ฐธ์กฐ(Reference)ํ•˜๊ฑฐ๋‚˜ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ constructor๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
      • ์ž์‹ ํด๋ž˜์Šค์—์„œ constructor๋ฅผ ์„ ์–ธํ•˜์ง€ ์•Š์œผ๋ฉด ๋ถ€๋ชจ์˜ constructor๋ฅผ ๋ฐ”๋ผ๋ด…๋‹ˆ๋‹ค.
      • ๊ทธ๋Ÿฌ๋‚˜ ์ž์‹ ํด๋ž˜์Šค์—์„œ constructor๋ฅผ ์„ ์–ธํ–ˆ์Œ์—๋„ super() ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์ฐธ์กฐ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

super ํ‚ค์›Œ๋“œ๋Š” ์–‘์ด ๋งŽ์•„ ๋‹จ์›์„ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค.


super ํ‚ค์›Œ๋“œ

super ํ‚ค์›Œ๋“œ๋Š” ํ•จ์ˆ˜์ฒ˜๋Ÿผ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ this์™€ ๊ฐ™์ด ์‹๋ณ„์ž์ฒ˜๋Ÿผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ํŠน์ˆ˜ํ•œ ํ‚ค์›Œ๋“œ์ž…๋‹ˆ๋‹ค.

super ํ‚ค์›Œ๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

  1. super๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์Šˆํผ ํด๋ž˜์Šค์˜ constructor()๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  2. super๋ฅผ ์ฐธ์กฐํ•˜๋ฉด ์Šˆํผ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž์„ธํžˆ ์•Œ์•„๋ณผ๊นŒ์š”?


super ํ˜ธ์ถœ

new ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ์„œ๋ธŒ ํด๋ž˜์Šค๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด์„œ ์ „๋‹ฌํ•œ ์ธ์ˆ˜๋Š” super ํ˜ธ์ถœ์„ ํ†ตํ•ด ์Šˆํผ ํด๋ž˜์Šค์˜ constructor()์— ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

์Šˆํผ ํด๋ž˜์Šค์—์„œ ์ถ”๊ฐ€ํ•œ ํ”„๋กœํผํ‹ฐ์™€ ์„œ๋ธŒ ํด๋ž˜์Šค์—์„œ ์ถ”๊ฐ€ํ•œ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ–๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๋ฉด ์„œ๋ธŒ ํด๋ž˜์Šค์˜ constructor๋ฅผ ์ƒ๋žตํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ new ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ์„œ๋ธŒ ํด๋ž˜์Šค๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด์„œ ์ „๋‹ฌํ•œ ์ธ์ˆ˜๋ฅผ ์Šˆํผ ํด๋ž˜์Šค์˜ constructor์— super ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•˜์—ฌ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// ์Šˆํผ ํด๋ž˜์Šค
class Base {
  constructor(a, b) { // โ‘ฃ
    this.a = a;
    this.b = b;
  }
}

// ์„œ๋ธŒ ํด๋ž˜์Šค
class Derived extends Base {
  // ์•”๋ฌต์ ์œผ๋กœ constructor๊ฐ€ ์ •์˜๋˜์ง€๋งŒ ์ง์ ‘ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  // constructor(...args) { super(...args); }
  constructor(a, b, c) {
    super(a, b);
    this.c = c;
  }
}

const derived = new Derived(1, 2, 3);
console.log(derived); // Derived {a: 1, b: 2, c: 3}

์ด ๋•Œ ์ฃผ์˜์‚ฌํ•ญ์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ์„œ๋ธŒ ํด๋ž˜์Šค์—์„œ constructor๋ฅผ ์ƒ๋žตํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, ์„œ๋ธŒ ํด๋ž˜์Šค์˜ constructor์—์„  ๋ฐ˜๋“œ์‹œ super๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    class Base {}
    
    class Derived extends Base {
      constructor() {
        // ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor
        console.log('constructor call');
      }
    }
    
    const derived = new Derived();

  1. ์„œ๋ธŒ ํด๋ž˜์Šค์˜ constructor์—์„œ super๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— this๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
    class Base {}
    
    class Derived extends Base {
      constructor() {
        // ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor
        this.a = 1;
        super();
      }
    }
    
    const derived = new Derived(1);

  1. super๋Š” ๋ฐ˜๋“œ์‹œ ์„œ๋ธŒ ํด๋ž˜์Šค์˜ constructor์—์„œ๋งŒ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ธŒ ํด๋ž˜์Šค๊ฐ€ ์•„๋‹Œ ํด๋ž˜์Šค์˜ constructor๋‚˜ ํ•จ์ˆ˜์—์„œ super๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ด์š”.
    // ์Šˆํผ ํด๋ž˜์Šค
    class Base {
      constructor(name) {
        this.name = name;
      }
    
      sayHi() {
        return `Hi! ${this.name}`;
      }
    }
    
    // ์„œ๋ธŒ ํด๋ž˜์Šค
    class Derived extends Base {
      sayHi() {
        // super.sayHi๋Š” ์Šˆํผ ํด๋ž˜์Šค์˜ ํ”„๋กœํ† ํƒ€์ž… ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.
        return `${super.sayHi()}. how are you doing?`;
      }
    }
    
    const derived = new Derived('Lee');
    console.log(derived.sayHi()); // Hi! Lee. how are you doing?

super ์ฐธ์กฐ

super๋Š” ์ž์‹ฌ์„ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฐ”์ธ๋”ฉ๋œ ๊ฐ์ฒด์˜ ํ”„๋กœํ† ํƒ€์ž…์„ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.

super๋ฅผ ์ฐธ์กฐ๋กœ ์‚ฌ์šฉํ•˜๋Š” ํ˜•ํƒœ๋“ค์„ ๋ณผ๊นŒ์š”?

  • ์„œ๋ธŒ ํด๋ž˜์Šค์˜ ํ”„๋กœํ† ํƒ€์ž… ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ super.๋ฉ”์„œ๋“œ๋Š” ์Šˆํผ ํด๋ž˜์Šค์˜ ํ”„๋กœํ† ํƒ€์ž… ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.

    // ์Šˆํผ ํด๋ž˜์Šค
    class Base {
      constructor(name) {
        this.name = name;
      }
    
      sayHi() {
        return `Hi! ${this.name}`;
      }
    }
    
    // ์„œ๋ธŒ ํด๋ž˜์Šค
    class Derived extends Base {
      sayHi() {
        // super.sayHi๋Š” ์Šˆํผ ํด๋ž˜์Šค์˜ ํ”„๋กœํ† ํƒ€์ž… ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.
        return `${super.sayHi()}. how are you doing?`;
      }
    }
    
    const derived = new Derived('Lee');
    console.log(derived.sayHi()); // Hi! Lee. how are you doing?
    • ๋‹จ, super๊ฐ€ ์Šˆํผ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฐ”์ธ๋”ฉ ๋œ ๊ฐ์ฒด์ธ ์Šˆํผ ํด๋ž˜์Šค์˜ prototype ํ”„๋กœํผํ‹ฐ์— ๋ฐ”์ธ๋”ฉ๋œ ํ”„๋กœํ† ํƒ€์ž…์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ์ฒ˜๋Ÿผ์š”.
      // ์Šˆํผ ํด๋ž˜์Šค
      class Base {
        constructor(name) {
          this.name = name;
        }
      
        sayHi() {
          return `Hi! ${this.name}`;
        }
      }
      
      class Derived extends Base {
        sayHi() {
          // __super๋Š” Base.prototype์„ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.
          const __super = Object.getPrototypeOf(Derived.prototype);
          return `${__super.sayHi.call(this)} how are you doing?`;
        }
      }
    • ์ด๋ ‡๊ฒŒ ๋™์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ๋ฉ”์„œ๋“œ๋Š” ๋‚ด๋ถ€ ์Šฌ๋กฏ [[HomeObject]]๋ฅผ ๊ฐ€์ง€๋ฉฐ ์ž์‹ ์„ ๋ฐ”์ธ๋”ฉํ•˜๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.
      • ๋‹จ, ES6์˜ ๋ฉ”์„œ๋“œ ์ถ•์•ฝ ํ‘œํ˜„์œผ๋กœ ์ •์˜๋œ ํ•จ์ˆ˜๋งŒ [[HomeObject]]๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค.
        const obj = {
          // [[HomeObject]]๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค.
          foo() {},
          // [[HomeObject]]๋ฅผ ๊ฐ–์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
          bar: function () {}
        };

    ๊ฒฐ๊ตญ super ์ฐธ์กฐ๋ฅผ ์˜์‚ฌ ์ฝ”๋“œ๋กœ ํ‘œํ˜„ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    super = Object.getPrototypeOf([[HomeObject]])
    1. [[HomeObject]]๋Š” ๋ฉ”์„œ๋“œ ์ž์‹ ์„ ๋ฐ”์ธ๋”ฉํ•˜๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.
    2. [[HomeObject]]๋ฅผ ํ†ตํ•ด ๋ฉ”์„œ๋“œ ์ž์‹ ์„ ๋ฐ”์ธ๋”ฉํ•˜๊ณ  ์žˆ๋Š” ๊ฐ์ฒด์˜ ํ”„๋กœํ† ํƒ€์ž…์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    3. ์˜ˆ๋กœ ๋“ค์ž๋ฉด, Derived ํด๋ž˜์Šค์˜ sayHi ๋ฉ”์„œ๋“œ๋Š” Derived.prototype์— ๋ฐ”์ธ๋”ฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
      • ๋”ฐ๋ผ์„œ Derived ํด๋ž˜์Šค์˜ sayHi ๋ฉ”์„œ๋“œ์˜ [[HomeObject]]๋Š” Derived.prototype์ด๊ณ , ์ด๋ฅผ ํ†ตํ•ด Derived ํด๋ž˜์Šค์˜ sayHi ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์˜ super ์ฐธ์กฐ๊ฐ€ Base.prototype์œผ๋กœ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.
      • ์ตœ์ข…์ ์œผ๋กœ super.sayHi๋Š” Base.prototype.sayHi๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋ผ์ฃ .

  • ์„œ๋ธŒ ํด๋ž˜์˜ ์ •์  ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ super.๋ฉ”์„œ๋“œ๋Š” ์Šˆํผ ํด๋ž˜์Šค์˜ ์ •์  ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.
    // ์Šˆํผ ํด๋ž˜์Šค
    class Base {
      static sayHi() {
        return 'Hi!';
      }
    }
    
    // ์„œ๋ธŒ ํด๋ž˜์Šค
    class Derived extends Base {
      static sayHi() {
        // super.sayHi๋Š” ์Šˆํผ ํด๋ž˜์Šค์˜ ์ •์  ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.
        return `${super.sayHi()} how are you doing?`;
      }
    }
    
    console.log(Derived.sayHi()); // Hi! how are you doing?

์ƒ์† ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ๊ณผ์ •

ํด๋ž˜์Šค๊ฐ€ ๋‹จ๋…์œผ๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ณผ์ •๋ณด๋‹ค ์ƒ์†์„ ํ†ตํ•ด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ณผ์ •์ด ๋” ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค.

์„œ๋ธŒ ํด๋ž˜์Šค๊ฐ€ new ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ํ˜ธ์ถœ๋˜๋ฉด ์•„๋ž˜์˜ ๊ณผ์ •์„ ํ†ตํ•ด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  • ์„œ๋ธŒ ํด๋ž˜์Šค์˜ super ํ˜ธ์ถœ
    • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ํด๋ž˜์Šค ํ‰๊ฐ€ ์‹œ ์Šˆํผ ํด๋ž˜์Šค์™€ ์„œ๋ธŒ ํด๋ž˜์Šค๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด base ๋˜๋Š” derived๋ฅผ ๊ฐ’์œผ๋กœ ๊ฐ–๋Š” ๋‚ด๋ถ€ ์Šฌ๋กฏ [[ConstructorKind]]๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค.
    • ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์ง€ ์•Š๋Š” ํด๋ž˜์Šค๋Š” ๋‚ด๋ถ€ ์Šฌ๋กฏ [[ConstructorKind]]์˜ ๊ฐ’์ด base์ธ ๋ฐ˜๋ฉด, ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›๋Š” ํด๋ž˜์Šค๋Š” derived๋กœ ์„ค์ •๋˜๋ฉฐ ์ด๋ฅผ ํ†ตํ•ด ๋™์ž‘์ด ๊ตฌ๋ถ„๋ฉ๋‹ˆ๋‹ค.
    • ์ƒ์†๋ฐ›๋Š” ํด๋ž˜์Šค๊ฐ€ new ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ํ˜ธ์ถœ๋˜๋ฉด ์ž์‹ ์ด ์ง์ ‘ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ์Šˆํผ ํด๋ž˜์Šค์— ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ์„ ์œ„์ž„ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒŒ ๋ฐ”๋กœ ์„œ๋ธŒ ํด๋ž˜์Šค์˜ constructor์—์„œ ๋ฐ˜๋“œ์‹œ super๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•˜๋Š” ์ด์œ ์ฃ .
    • super๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ์Šˆํผ ํด๋ž˜์Šค์˜ constructor๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์„œ๋ธŒ ํด๋ž˜์Šค์˜ constructor ๋‚ด๋ถ€์— super ํ˜ธ์ถœ์ด ์—†๋‹ค๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ด์œ ๋Š” ์‹ค์ œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ฃผ์ฒด๋Š” ์Šˆํผ ํด๋ž˜์Šค์ด๋ฏ€๋กœ, ์Šˆํผ ํด๋ž˜์Šค์˜ constructor๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š์œผ๋ฉด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด์ฃ .

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

  • ์Šˆํผ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ์ดˆ๊ธฐํ™”
    • ์Šˆํผ ํด๋ž˜์Šค์˜ constructor๊ฐ€ ์‹คํ–‰๋˜๊ณ  this์— ๋ฐ”์ธ๋”ฉ๋œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

  • ์„œ๋ธŒ ํด๋ž˜์Šค constructor๋กœ์˜ ๋ณต๊ท€์™€ this ๋ฐ”์ธ๋”ฉ
    • super ํ˜ธ์ถœ์ด ์ข…๋ฃŒ๋˜๊ณ  ์ œ์–ด ํ๋ฆ„์ด ์„œ๋ธŒ ํด๋ž˜์Šค๋กœ ๋Œ์•„์˜ค๋ฉด super๊ฐ€ ๋ฐ˜ํ™˜ํ•œ ์ธ์Šคํ„ด์Šค๊ฐ€ this์— ๋ฐ”์ธ๋”ฉ๋ฉ๋‹ˆ๋‹ค.
    • ์„œ๋ธŒ ํด๋ž˜์Šค๋Š” ๋ณ„๋„์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  super๊ฐ€ ๋ฐ˜ํ™˜ํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ this์— ๋ฐ”์ธ๋”ฉํ•˜์—ฌ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • ์ด์ฒ˜๋Ÿผ super๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š์œผ๋ฉด ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜๊ธฐ๋Š” ์ปค๋…• this ๋ฐ”์ธ๋”ฉ๋„ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„œ๋ธŒ ํด๋ž˜์Šค์˜ constructor์—์„œ super๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์—๋Š” this๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋Š” ์ด์œ ์ฃ .

  • ์„œ๋ธŒํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ์ดˆ๊ธฐํ™”
    • ์„œ๋ธŒ ํด๋ž˜์Šค์˜ constructor๊ฐ€ ์‹คํ–‰๋˜๊ณ  this์— ๋ฐ”์ธ๋”ฉ๋œ ์ธ์Šคํ„ด์Šค์— ํ”„๋กœํผํ‹ฐ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  • ์ธ์Šคํ„ด์Šค ๋ฐ˜ํ™˜
    • ํด๋ž˜์Šค์˜ ๋ชจ๋“  ์ฒ˜๋ฆฌ๊ฐ€ ๋๋‚˜๋ฉด ์™„์„ฑ๋œ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฐ”์ธ๋”ฉ๋œ this๊ฐ€ ์•”๋ฌต์ ์œผ๋กœ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.