๐Ÿชด ์„ฑ์žฅ์ผ์ง€

์ฑ… ํ–‰๋ณตํ•œ ์ด๊ธฐ์ฃผ์˜์ž(์›จ์ธ ๋‹ค์ด์–ด)์˜ ๋‚ด์šฉ์— ์ž๊ทน๋ฐ›์•„ ์‹œ์ž‘ํ•˜๋Š” ์†Œ๋ฐ•ํ•œ ์„ฑ์žฅ๊ธฐ๋ก

์‚ด์•„์žˆ๋Š” ๊ฝƒ๊ณผ ์ฃฝ์€ ๊ฝƒ์€ ์–ด๋–ป๊ฒŒ ๊ตฌ๋ณ„ํ•˜๋Š”๊ฐ€?
์„ฑ์žฅํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ์‚ด์•„ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.
์ƒ๋ช…์˜ ์œ ์ผํ•œ ์ฆ๊ฑฐ๋Š” ์„ฑ์žฅ์ด๋‹ค!

๐ŸŒณ ํ‚ค์›Œ๋“œ ์ตœ๋Œ€ํ•œ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ •๋ฆฌ, ์ถ”ํ›„์— ๋ณด๋ฉด์„œ ์Šค์Šค๋กœ ์„ค๋ช…

JavaScript ํด๋ž˜์Šค

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ํ”„๋กœํ† ํƒ€์ž… ๊ธฐ๋ฐ˜ ์–ธ์–ด์ด๊ธฐ์— ์ƒ์†์˜ ๊ฐœ๋…์ด ์กด์žฌํ•˜์ง€ ์•Š์Œ
ES6๋ถ€ํ„ฐ๋Š” ํด๋ž˜์Šค ๋ฌธ๋ฒ•์ด ์ถ”๊ฐ€๋˜์—ˆ์œผ๋‚˜, ์‚ฌ์‹ค์ƒ ์ด๊ฒƒ๋„ ํ”„๋กœํ† ํƒ€์ž…์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ๋ถ€๋ถ„๋“ค์ด ์žˆ์Œ

  • class: ์ง‘๋‹จ, ์ง‘ํ•ฉ์œผ๋กœ ๊ณตํ†ต์˜ ์†์„ฑ์„ ๋ชจ์•„๋†“์€ ์ถ”์ƒ์ ์ธ ๊ฐœ๋… ex) ์Œ์‹, ๊ณผ์ผ
  • instance: ๊ตฌ์ฒด์ ์ธ ์˜ˆ์‹œ; class์— ์˜ํ•ด ๊ตฌ์ฒด์ , ์‹ค์ฒด์ ์œผ๋กœ ๊ตฌํ˜„๋œ ๊ฐœ์ฒด ex) ๋ฐ”๋‚˜๋‚˜, ์‚ฌ๊ณผ

ํด๋ž˜์Šค์˜ ์ƒํ•˜ ๊ด€๊ณ„ ์Œ์‹ ์ด๋ž€ ํด๋ž˜์Šค์™€ ๊ณผ์ผ ์ด๋ž€ ํด๋ž˜์Šค๊ฐ€ ์žˆ์„ ๋•Œ, ์Œ์‹์ด ๊ณผ์ผ์˜ superclass์ด๊ณ  ๊ณผ์ผ์€ ์Œ์‹์˜ subclass๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ์ƒ์œ„ ํด๋ž˜์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ๋•Œ, super๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ด๋‹(Remind)

์•ž์„œ ๋‹ค์ค‘ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ด๋‹์œผ๋กœ ํŠน์ • ์ƒ์„ฑ์ž์˜ protorype์— ์–ป๊ณ  ์‹ถ์€ ๋ฉ”์„œ๋“œ๋ฅผ ํฌํ•จํ•˜๋Š” ์ƒ์„ฑ์ž์˜ instance๋ฅผ ํ• ๋‹นํ•จ์œผ๋กœ์จ ๊ทธ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋˜ ๊ฐœ๋…

๊ฒฐ๊ตญ ํ”„๋กœํ† ํƒ€์ž… ๊ธฐ๋ฐ˜์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„  ์ด์™€ ์œ ์‚ฌํ•˜๊ฒŒ ํด๋ž˜์Šค๋ฅผ ๊ตฌํ˜„

// ๊ธฐ๋ณธ์ ์œผ๋กœ SubClass, SuperClass๋ผ๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์กด์žฌํ•œ๋‹ค๊ณ  ๊ฐ€์ •
var instance = new SubClass();
// ์ด ๋•Œ, SubClass์ด๋ž€ ์ƒ์„ฑ์ž์— ๋” ๋‚˜์•„๊ฐ€ SuperClass๋ผ๋Š” ์ƒ์„ฑ์ž๋ฅผ ์ฒด์ด๋‹ํ•˜๊ณ  ์‹ถ์œผ๋ฉด
SubClass.prototype = new SuperClass();
// ์ดํ›„ ๋งŒ๋“  instance๋Š” ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ด๋‹์— ์˜ํ•ด SubClass.prototype์—๋„ ์ ‘๊ทผ ๊ฐ€๋Šฅ
var instance2 = new SubClass();

ํ”„๋กœํ† ํƒ€์ž… ๊ธฐ๋ฐ˜ ํด๋ž˜์Šค ๊ตฌํ˜„์˜ ๋ฌธ์ œ์ 

์œ„์˜ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ์‚ดํŽด๋ณด๋ฉด

  1. SuperClass์˜ static method ํ˜น์€ property๊ฐ€ ๊ทธ๋Œ€๋กœ ๋‚จ์•„์žˆ์Œ
  • ๋‹น์žฅ์€ ๋ฌธ์ œ๊ฐ€ ์•ˆ๋˜์–ด๋„, ํ”„๋กœํผํ‹ฐ ๋ฐ ๋ฉ”์„œ๋“œ ๋ช…์ด ์ค‘์ฒฉ๋  ์ˆ˜ ์žˆ๊ณ  ์›์น˜ ์•Š์€ ๊ฐ’์ด ๋‚˜์˜ฌ ๊ฐ€๋Šฅ์„ฑ์ด ์กด์žฌ
  1. instance2.__proto__.constructor๋ฅผ ํ•ด๋„ instance2.__proto__(.__proto__).constructor์ด๋ฏ€๋กœ SuperClass๋ฅผ ์˜๋ฏธ. ์ฆ‰, SubClass์— ์ ‘๊ทผ ํ•  ์ˆ˜๊ฐ€ ์—†์Œ
ํ•ด๊ฒฐ๋ฒ•
  • method ๋ฐ property๊ฐ€ ๊ทธ๋Œ€๋กœ ๋‚จ์•„์žˆ๋Š” ๋ฌธ์ œ

    1. SuperClass์˜ instance๋ฅผ ํ• ๋‹น ํ›„, delete์„ ํ†ตํ•ด ๋‚ด๋ถ€ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ผ์ผํžˆ ์ง€์šฐ๊ธฐ
    2. var Bridge = function () {};์ธ ๋น„์–ด์žˆ๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ํ™œ์šฉํ•˜๊ธฐ
    3. ES5์—์„œ ๋„์ž…๋œ Object.create(์ƒ์†ํด๋ž˜์Šค.prototype)์„ ํ™œ์šฉ
  • SubClass ์ž์ฒด์— ์ ‘๊ทผ ๋ชปํ•˜๋Š” ๋ฌธ์ œ

    • SubClass.prototype.constructor = SubClass; ๋กœ ๋”ฐ๋กœ ํ• ๋‹นํ•ด์ฃผ๊ธฐ

ES6์˜ class ๋ง›๋ณด๊ธฐ

์˜ˆ์‹œ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๊ณ  ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ new๋ฅผ ํ†ตํ•ด ํ˜ธ์ถœํ•˜๋ฉด instance๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค.

// ES5: ํ”„๋กœํ† ํƒ€์ž…์œผ๋กœ ๊ตฌํ˜„
var Dog = function (name) {
  this.name = name;
};

Dog.staticMethod = function () {
  return this.name + '์Šคํ…Œํ‹ฑ ๋ฉ”์„œ๋“œ';
};
Dog.prototype.bark = function () {
  return this.name + ': ์™ˆ์™ˆ!';
};

// ES6: class๋กœ ๊ตฌํ˜„
var Dog = class {
  constructor (name) {
    this.name = name;
  }
  static staticMethod {
    return this.name + '์Šคํ…Œํ‹ฑ ๋ฉ”์„œ๋“œ';
  }
  bark () {
    return this.name + ': ์™€์šธ์™€์šธ!';
  }
};