๐ŸŒ• ๋ณด๋ฆ„์นผ๋Ÿผ

๋‹จ์ˆœ ๊ธฐ๋ก๋ณด๋‹จ ์ข€ ๋” ์–‘์งˆ์˜, ์ •๋ฆฌ๋œ ๊ธ€์„ ์“ฐ๊ณ ์ž ์‹œ์ž‘ํ•˜๋Š” ๋ณด๋ฆ„์นผ๋Ÿผ
๋ถ€๋‹ด์—†์ด ๋งค ๋ณด๋ฆ„ ํ•˜๋‚˜์˜ ์ฃผ์ œ๋ฅผ ๊นŠ๊ฒŒ ๋“ค์—ฌ๋‹ค๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๊ฐ€ ๋˜์—ˆ์œผ๋ฉด ์ข‹๊ฒ ๋‹ค.
๊ฐ€์ˆ˜ ์œค์ข…์‹ ๋‹˜์ด ์›”๊ฐ„ ์œค์ข…์‹ ์„ ํ†ตํ•ด ๊พธ์ค€ํžˆ ์Œ์•…์„ ๋‚ด์‹œ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด ๋ณด๋ฆ„์นผ๋Ÿผ์„ ์ ์–ด๋ณด์ž!

๋ณด๋ฆ„์นผ๋Ÿผ ๊ทœ์น™

  1. ๋งค์ผ์„ ๊ธฐ๋กํ•˜๋Š” ์„ฑ์žฅ์ผ์ง€๋ณด๋‹ค ์ข€๋” ๊นŠ์€ ๋‚ด์šฉ์˜ ๊ธ€์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์ž.
  2. ๋„ˆ๋ฌด ์š•์‹ฌ๋ถ€๋ฆฌ์ง€๋ง๊ณ  ํ•˜๋‚˜์˜ ์ฃผ์ œ(ํ‚ค์›Œ๋“œ)์— ์ง‘์ค‘ํ•œ๋‹ค.
  3. 2์ฃผ์— ํ•œ ๋ฒˆ ๋‹ค๋“ฌ์–ด์ง„ ์นผ๋Ÿผ ํ˜•ํƒœ์˜ ๊ธ€์„ ์ž‘์„ฑํ•œ๋‹ค.
  4. ๋งˆ๊ฐ์€ ๋งค์ฃผ ์ผ์š”์ผ์„ ๊ธฐ์ค€์œผ๋กœ ํ•œ๋‹ค.

๐Ÿ“ƒ ๊ธ€๋˜ 8๊ธฐ

๊ฐœ๋ฐœ์ž๋“ค์ด ๋ชจ์—ฌ ํ•จ๊ป˜ ๊ธ€์„ ์“ฐ๊ณ  ํ”ผ๋“œ๋ฐฑํ•˜๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ์ธ ๊ธ€๋˜(๊ธ€์“ฐ๋Š” ๋˜๋ผ์ด๊ฐ€ ์„ธ์ƒ์„ ๋ฐ”๊พผ๋‹ค.)์—์„œ ํ™œ๋™ํ•˜๊ฒŒ ๋˜์–ด ๋ณด๋ฆ„์นผ๋Ÿผ์˜ ๊ทœ์น™์€ ๊ธ€๋˜์˜ ๊ทœ์น™์„ ๋”ฐ๋ฅด๊ธฐ๋กœ ํ•œ๋‹ค.
2์ฃผ๋งˆ๋‹ค ๊ธ€์„ ์ž‘์„ฑํ•˜๋Š” ๊ทœ์น™์€ ๋™์ผํ•˜๋ฉฐ, ๊ทธ ๋งˆ๊ฐ ๋‚ ์งœ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค. ๋งˆ๊ฐ ๋‚ ์งœ๋ฅผ ์ฒดํฌํ•˜๋ฉฐ ๋งค๋ฒˆ ๊ธ€ ์ž‘์„ฑ์— ๋Œ€ํ•ด ์ธ์ง€ํ•˜๋„๋ก ํ•˜์ž!

๐Ÿšˆ ๋“ค์–ด๊ฐ€๊ธฐ์— ์•ž์„œโ€ฆ

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

๐Ÿœ ๊ฐœ๋ฏธ ํด๋ž˜์Šค

์ด์ „ ํด๋ž˜์Šค์ธ ๊ฐœ๋ฏธ๋ฅผ ๋‹ค์‹œ ํ•œ๋ฒˆ ๋ณด์ž.

class Ant {
  constructor(name, age, position) {
    this.name = name;
    this.age = age;
    this.position = position;
  }
  
  move() {
    if (Math.random() < 0.5) {
      this.position--;
    } else {
      this.position++;
    }
  }
  
  report() {
    console.log(`${this.name} ๊ฐœ๋ฏธ์˜ ์œ„์น˜๋Š” ${this.position} ์ง€์  ์ž…๋‹ˆ๋‹ค.`)
  }
}

๊ธฐ์กด Ant class์—์„œ ๋ณธ์ธ์˜ ์ •๋ณด๋ฅผ ๋ณด๊ณ ํ•˜๋Š” report() ๋ฉ”์„œ๋“œ๋งŒ ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ๋‹ค.

๐Ÿœ ๊ฒ€์€๊ฐœ๋ฏธ ํด๋ž˜์Šค(feat. ์ƒ์†)

Ant class๋Š” ์ „๋ฐ˜์ ์ธ ๊ฐœ๋ฏธ๋ฅผ ํ‘œํ˜„ํ•œ๋‹ค. ๊ทธ๋ ‡์ง€๋งŒ ํ˜„์‹ค ์„ธ๊ณ„์˜ ๊ฐœ๋ฏธ๋Š” ๊ฒ€์€๊ฐœ๋ฏธ๋„ ์žˆ๊ณ , ํฐ๊ฐœ๋ฏธ๋„ ์žˆ๊ณ , ๋ถ‰์€๊ฐœ๋ฏธ ๋“ฑ๋“ฑ ๋‹ค์–‘ํ•œ ์ข…์ด ์กด์žฌํ•œ๋‹ค.
๊ทธ๋ ‡๋‹ค๋ฉด ๊ฐœ๋ฏธ๋ณด๋‹ค ์ƒ๋Œ€์ ์œผ๋กœ ๋” ํ•˜์œ„์— ์žˆ๋Š” ๊ฐœ์ฒด๋Š” ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์„๊นŒ? ๋จผ์ € Ant class๋ฅผ ์ƒ์†ํ•˜์—ฌ ๊ฒ€์€๊ฐœ๋ฏธ class๋ฅผ ๊ตฌํ˜„ํ•ด๋ณด์ž.

class BlackAnt extends Ant {
  constructor(name, age, position) {
    super(name, age, position);
  }
  
  sayColor() {
    console.log("I'm Black Ant");
  }
}

์œ„์™€ ๊ฐ™์ด ์ƒ์†ํ•จ์œผ๋กœ์จ Ant class์˜ ์†์„ฑ(name, age, position)๊ณผ ๋ฉ”์„œ๋“œ(move(), report())๋ฅผ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์˜ค๋ฉด์„œ BlackAnt๋งŒ์ด ๊ฐ–๋Š” sayColor()๋ผ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

๐Ÿœ (์ถ”๊ฐ€)๊ฒ€์€๊ฐœ๋ฏธ ํด๋ž˜์Šค๋ฅผ ๊ตณ์ด ์ƒ์†์œผ๋กœ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์žˆ์„๊นŒ?

์ƒ์†์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒ€์€๊ฐœ๋ฏธ ํด๋ž˜์Šค๋ฅผ ๊ตฌํ˜„ํ•ด๋ณด์•˜๋‹ค. ๊ทธ๋ ‡์ง€๋งŒ ์—ฌ๊ธฐ์„œ ํ•œ๊ฐ€์ง€ ์˜๋ฌธ์ด ๋“ค ์ˆ˜ ์žˆ๋‹ค. ๊ณผ์—ฐ ์œ„์˜ ๊ฒ€์€๊ฐœ๋ฏธ ํด๋ž˜์Šค๊ฐ€ ์ ์ ˆํ• ๊นŒ?
sayColor()๋ผ๋Š” ๋ฉ”์„œ๋“œ๋Š” ๊ตณ์ด BlackAnt์—๋งŒ ์กด์žฌํ•ด์•ผํ•˜๋Š”์ง€ ๋‹ค์‹œ ํ•œ๋ฒˆ ๊ณ ๋ฏผํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๊ตณ์ด ์ƒ์†์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•จ์ด ์•„๋‹ˆ๋ผ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

class Ant {
  constructor(name, age, position, color) {
    this.name = name;
    this.age = age;
    this.position = position;
    this.color = color;
  }
  
  move() {
    if (Math.random() < 0.5) {
      this.position--;
    } else {
      this.position++;
    }
  }
  
  report() {
    console.log(`${this.name} ๊ฐœ๋ฏธ์˜ ์œ„์น˜๋Š” ${this.position} ์ง€์  ์ž…๋‹ˆ๋‹ค.`)
  }
  
  sayColor() {
    console.log(`I'm ${this.color} Ant!`)
  }
}

const blackFirst = new Ant('ark', 3, 0, 'Black');

4๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๊ฐœ๋ฏธ์˜ ์ƒ‰๊น”์„ ์ „๋‹ฌํ•จ์œผ๋กœ์จ ๊ฒ€์€๊ฐœ๋ฏธ ๊ฐ์ฒด๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ด์™€ ๊ฐ™์ด ๊ฐœ๋ฐœ์—๋Š” ์ •๋‹ต์ด ์—†์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๋ณธ์ธ์ด ํ•„์š”ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์ƒ๊ฐํ•ด์„œ ์ฝ”๋“œ๋ฅผ ์งœ๋ฉด ๋œ๋‹ค.

๐Ÿœ ์—ฌ์™•๊ฐœ๋ฏธ ํด๋ž˜์Šค(feat. ํ•ฉ์„ฑ, ์œ„์ž„)

๊ทธ๋ ‡๋‹ค๋ฉด ์ด์ œ ์—ฌ์™•๊ฐœ๋ฏธ ํด๋ž˜์Šค๋ฅผ ๊ตฌํ˜„ํ•ด๋ณด์ž. ์—ฌ์™•๊ฐœ๋ฏธ๋Š” ์œ„์—์„œ ๊ตฌํ˜„ํ•œ ๊ฒ€์€๊ฐœ๋ฏธ๋ฅผ ์œ„์ž„๋ฐ›์•„์„œ ๊ทธ ๊ฐœ๋ฏธ๋ฅผ ๋‹ค๋ฃจ๋„๋ก ํ•  ๊ฒƒ์ด๋‹ค.(์—ฌ์™•๊ฐœ๋ฏธ๋‹ˆ๊นŒ ์ง์ ‘ ์›€์ง์ด์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค.)
(์—ฌ์™•๊ฐœ๋ฏธ๋„ ๊ฐœ๋ฏธ์ด๋ฏ€๋กœ Ant๋ฅผ ์ƒ์†ํ•ด์•ผ๊ฒ ์ง€๋งŒ ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ๋…๋ฆฝ์ ์ธ ์—ฌ์™•๊ฐœ๋ฏธ(QueenAnt) ํด๋ž˜์Šค๋ฅผ ๊ตฌํ˜„ํ•ด๋ณด๊ฒ ๋‹ค.)

// ์—ฌ๊ธฐ์— BlackAnt ํด๋ž˜์Šค ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •

class QueenAnt {
  constructor(workers = []) {
    this.workers = workers;
  }
  
  makeWorker(name, age, position) {
    const worker = new BlackAnt(name, age, position);
    this.workers.push(worker);
  }
  
  commandMove() {
    this.workers.forEach((worker) => worker.move());
  }
  
  commandReport() {
    this.workers.forEach((worker) => worker.report());
  }
}

์ฝ”๋“œ ์–‘์ด ์กฐ๊ธˆ ๋Š˜์–ด๋‚ฌ์ง€๋งŒ, ๊ทธ ์ปจ์…‰์€ ๊ฐ„๋‹จํ•˜๋‹ค. ์—ฌ์™•๊ฐœ๋ฏธ๋Š” workers๋ผ๋Š” ๋ฐฐ์—ด๋กœ ์ผ๊ฐœ๋ฏธ๋“ค์„ ๊ฐ–๊ณ  ์žˆ๋‹ค. ๋˜ํ•œ makeWorker()์„ ํ†ตํ•ด ์ „๋‹ฌ๋œ name, age, position์„ ๊ฐ–๋Š” ๊ฒ€์€๊ฐœ๋ฏธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  workers์— ์ถ”๊ฐ€ํ•œ๋‹ค. ๋ฐ”๋กœ ์ด ๋•Œ, BlackAnt๊ฐ€ ์œ„์ž„๋œ ๊ฒƒ์ด๋‹ค.
์ด์ œ commandMove(), commandReport() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด์„œ ๊ฐ๊ฐ์˜ ๊ฐœ๋ฏธ๋“ค์ด ์ผ์ œํžˆ ์›€์ง์ด๊ณ  ๋ณธ์ธ์˜ ์ด๋ฆ„๊ณผ ์œ„์น˜๋ฅผ ๋ณด๊ณ ํ•˜๊ฒŒ ๋œ๋‹ค.

๋ง๊ทธ๋Œ€๋กœ ์œ„์ž„(ํ˜น์€ ํ•ฉ์„ฑ; composition)์„ ํ†ตํ•ด์„œ QueenAnt๋Š” ๊ตณ์ด move, report ๋“ฑ์˜ ๋ฉ”์„œ๋“œ ์—†์ด๋„ BlackAnt๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉ(ํ™œ์šฉ)ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ๋งŒ์•ฝ BlackAnt๋ฅผ ์ƒ์†ํ•˜์—ฌ QueenAnt๋ฅผ ๊ตฌํ˜„ํ–ˆ๋‹ค๋ฉด BlackAnt์— ๋Œ€ํ•œ ์˜์กด์„ฑ์ด ๋†’์•„์ ธ ์œ„์ž„๋ณด๋‹ค ๋” ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์šธ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค.(๋ฌผ๋ก  ์ด๊ฒƒ๋„ ๋•Œ์— ๋”ฐ๋ผ์„œ ๋‹ค๋ฅด๋‹ค.)

๐Ÿœ ๋˜๋‹ค๋ฅธ ์—ฌ์™•๊ฐœ๋ฏธ ํด๋ž˜์Šค(feat. ์˜์กด์„ฑ ์ฃผ์ž…(DI))

์˜์กด์„ฑ ์ฃผ์ž…(Dependency Injection; DI)๋Š” ๋ฌด์—‡์ผ๊นŒ? ํ˜น์‹œ ์ด ๋‹จ์–ด์—์„œ ์–ด๋”˜๊ฐ€ ์ด์ƒํ•จ์„ ๋Š๊ปด์ง€์ง€ ์•Š๋Š”๊ฐ€? ๊ฐ์ฒด์ง€ํ–ฅ์€ ๊ฐ ๊ฐ์ฒด๊ฐ„์˜ ์ฑ…์ž„๊ณผ ์—ญํ• ์„ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ ์ฆ‰, ์˜์กด์„ฑ์„ ๋‚ฎ์ถค์œผ๋กœ์จ ์ œํ’ˆ์˜ ์œ ์ง€๋ณด์ˆ˜, ๋ฆฌํŒฉํ† ๋ง, ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ ๋“ฑ์—์„œ ์œ ๋ฆฌํ•จ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•œ๋‹ค??? ๋œ์–ด๋‚ด์•ผํ•  ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•œ๋‹ค๋Š” ๊ฒƒ์ด ์ด์ƒํ•˜๊ฒŒ ๋Š๊ปด์งˆ ์ˆ˜ ์žˆ๋‹ค.
์‚ฌ์‹ค ์˜์กด์„ฑ ์ฃผ์ž…์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š”๋ฐ์—๋Š” ์™ธ๋ถ€์—์„œ ์–ด๋–ค ๊ธฐ๋Šฅ์„ ์ œ๊ณต(์ฃผ์ž…)๋ฐ›์Œ์œผ๋กœ์จ ๊ฐ ๊ฐ์ฒด์˜ ์˜์กด์„ฑ์„ ๋‚ฎ์ถ˜๋‹ค๋Š” ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค.
๊ฑฐ๋‘์ ˆ๋ฏธํ•˜๊ณ  ์œ„์˜ ์ฝ”๋“œ์—์„œ ์˜์กด์„ฑ ์ฃผ์ž…์„ ํ†ตํ•ด ๋˜๋‹ค๋ฅธ ์—ฌ์™•๊ฐœ๋ฏธ ํด๋ž˜์Šค๋ฅผ ๊ตฌํ˜„ํ•ด๋ณด์ž.

// ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ BlackAnt ํด๋ž˜์Šค ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •(ํ˜น์€ import)

class QueenAnt {
  constructor(Ant, workers = []) {
    this.workers = workers;
    this.Ant = Ant;
  }
  
  makeWorker(name, age, position) {
    const worker = new this.Ant(name, age, position);
    this.workers.push(worker);
  }
  
  commandMove() {
    this.workers.forEach((worker) => worker.move());
  }
  
  commandReport() {
    this.workers.forEach((worker) => worker.report());
  }
}

์ž, ์ด์ œ ์–ด๋–ค๊ฐ€? ์ด๋ฒˆ์—” QueenAnt ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ, ์–ด๋–ค Ant class๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š”๋‹ค. ์ฆ‰, name, age, position์„ ์ธ์ž๋กœ ๋ฐ›๋Š” ์–ด๋– ํ•œ Ant class๋„ ์ธ์ž๋กœ ๋ฐ›์•„์„œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ธฐ์กด์˜ QueenAnt๋Š” ์–ธ์ œ๋‚˜ BlackAnt๋ผ๋Š” class๋งŒ์„ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ, ์ด๋ฒˆ์— ๊ตฌํ˜„ํ•œ QueenAnt๋Š” ์˜์กด์„ฑ์„ ์ฃผ์ž… ๋ฐ›์Œ์œผ๋กœ์จ ์–ด๋– ํ•œ Ant๋“  ๋ฐ›์•„์„œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ๋˜ํ•œ, ์˜์กด์„ฑ ์ฃผ์ž…์„ ํ†ตํ•ด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋”์šฑ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. (๋ฌผ๋ก  ์œ„์˜ ์ฝ”๋“œ๊ฐ™์€ ๊ฒฝ์šฐ, class ์ž์ฒด๋ฅผ ๋„˜๊ฒจ์ฃผ๊ณ  ์žˆ์ง€๋งŒ ๋ณดํ†ต์€ ๊ตฌํ˜„ํ•œ ๊ฐ์ฒด๋ฅผ ๋„˜๊ฒจ์„œ ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•˜๋ฏ€๋กœ mock data ์ž‘์—…์— ์žˆ์–ด์„œ๋„ ์œ ๋ฆฌํ•ด์ง„๋‹ค.)

๐Ÿš‰ ๊ธ€์„ ๋งˆ์น˜๋ฉฐโ€ฆ

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

์•„์ง ๋งŽ์ด ๋ถ€์กฑํ•œ ๊ฐœ๋ฐœ์ž์ž…๋‹ˆ๋‹ค. ๋‚ด์šฉ์— ๋Œ€ํ•œ ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋‹ค๋ฉด, ์–ธ์ œ๋“  ํŽธํ•˜๊ฒŒ ๋ง์”€ํ•ด์ฃผ์„ธ์š”! ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

๐ŸŽ ์ฐธ๊ณ