CodeGym /ํ–‰๋™ /Frontend SELF KO /ํ”„๋กœํ† ํƒ€์ž…์„ ํ†ตํ•œ ์ƒ์†

ํ”„๋กœํ† ํƒ€์ž…์„ ํ†ตํ•œ ์ƒ์†

Frontend SELF KO
๋ ˆ๋ฒจ 39 , ๋ ˆ์Šจ 3
์‚ฌ์šฉ ๊ฐ€๋Šฅ

4.1 ์ƒ์† โ€” ์ด๊ฑด ์ •๋ง ์‰ฌ์›Œ

์ƒ์†์€ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ (OOP)์˜ ๊ธฐ๋ณธ ๊ฐœ๋… ์ค‘ ํ•˜๋‚˜์•ผ. ์ด๊ฑธ๋กœ ํ•˜๋‚˜์˜ ํด๋ž˜์Šค(์ž์‹ ํด๋ž˜์Šค ๋˜๋Š” ์„œ๋ธŒํด๋ž˜์Šค๋ผ๊ณ  ํ•ด) ๋‹ค๋ฅธ ํด๋ž˜์Šค(๋ถ€๋ชจ ํด๋ž˜์Šค ๋˜๋Š” ์Šˆํผํด๋ž˜์Šค๋ผ๊ณ  ๋ถˆ๋Ÿฌ)์˜ ํ•„๋“œ์™€ ๋ฉ”์†Œ๋“œ๋ฅผ ์ƒ์†๋ฐ›์„ ์ˆ˜ ์žˆ์–ด.

์ƒ์†

์ด ๋ฐฉ๋ฒ•์œผ๋กœ ์ผ๋ฐ˜์ ์ธ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ์ฝ”๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด. ๊ทธ๋ž˜์„œ ์ฝ”๋“œ ์กฐ์ง๊ณผ ์œ ์ง€ ๋ณด์ˆ˜๊ฐ€ ๋” ์ข‹์•„์ ธ.

์™œ ์ƒ์†์ด ํ•„์š”ํ• ๊นŒ?

์˜ˆ๋ฅผ ๋“ค์–ด ์–ด๋–ค ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ด. ๊ทธ๋ฆฌ๊ณ  ์ด๊ฑธ ํด๋ž˜์Šค ํ˜•ํƒœ๋กœ ์ž‘์„ฑํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค๊ณ  ์น˜์ž. ๊ทธ๋Ÿฐ๋ฐ ํ”„๋กœ์ ํŠธ์— ์ด๋ฏธ ๋‹น์‹ ์ด ์›ํ•˜๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ์ž‘์—…์„ ํ•˜๋Š” ํด๋ž˜์Šค๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜์ž. ๊ทธ๋Ÿผ ๊ทธ๋ƒฅ ๊ทธ ํด๋ž˜์Šค์˜ ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌํ•ด์„œ ์‚ฌ์šฉํ•ด๋„ ๋ผ.

์•„๋‹ˆ๋ฉด "๋ณต์‚ฌํ•œ ๊ฒƒ์ฒ˜๋Ÿผ" ํ•  ์ˆ˜๋„ ์žˆ์ง€. ๊ทธ ํด๋ž˜์Šค๋ฅผ ์ž์‹ ์˜ ํด๋ž˜์Šค์˜ ๋ถ€๋ชจ๋กœ ์„ ์–ธํ•˜๋ฉด JavaScript๊ฐ€ ๋‹น์‹ ์˜ ํด๋ž˜์Šค์— ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ํ–‰๋™์„ ์ถ”๊ฐ€ํ• ๊ฑฐ์•ผ.

๋งˆ์น˜ ์ž์—ฐ์ด ๋˜๊ณ  ์‹ถ๊ณ  ๊ฐœ๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๊ณ  ์ƒ์ƒํ•ด๋ด. ๋ฐ•ํ…Œ๋ฆฌ์•„๋กœ ๊ฐœ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ 10์–ต๋…„ ๊ฑธ๋ฆด๊นŒ, ์•„๋‹ˆ๋ฉด 20๋งŒ๋…„ ๋งŒ์— ๋Š‘๋Œ€๋ฅผ ๊ธธ๋“ค์ด๋Š” ๊ฒŒ ๋” ๋น ๋ฅผ๊นŒ?

4.2 ํ”„๋กœํ† ํƒ€์ž…์„ ํ†ตํ•œ ์ƒ์†์˜ ๊ฐœ๋…

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

JavaScript์˜ ๋ชจ๋“  ๊ฐ์ฒด๋Š” ์ž์‹ ์˜ ํ”„๋กœํ† ํƒ€์ž…์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ˆจ๊ฒจ์ง„ ์†์„ฑ [[Prototype]]์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด. ํ”„๋กœํ† ํƒ€์ž…์€ ์ƒ์†์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๊ณ , ์ด๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด๋“ค์ด ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ๋ถ€ํ„ฐ ์†์„ฑ๊ณผ ๋ฉ”์†Œ๋“œ๋ฅผ ์ƒ์†๋ฐ›์„ ์ˆ˜ ์žˆ์–ด.

๊ฐ„๋‹จํ•œ ์ƒ์† ์˜ˆ์ œ

๋‹จ๊ณ„ 1: ๊ธฐ๋ณธ ๊ฐ์ฒด ์ƒ์„ฑํ•˜๊ธฐ

JavaScript
    
      const animal = {
        eat() {
          console.log('Eating...');
        },

        sleep() {
          console.log('Sleeping...');
        }
      };
    
  

๋‹จ๊ณ„ 2: ์ƒ์† ๊ฐ์ฒด ์ƒ์„ฑํ•˜๊ธฐ

JavaScript
    
      const dog = Object.create(animal);

      dog.bark = function() {
        console.log('Barking...');
      };
    
  

๋‹จ๊ณ„ 3: ์ƒ์†๋œ ์†์„ฑ๊ณผ ๋ฉ”์†Œ๋“œ ์‚ฌ์šฉํ•˜๊ธฐ

JavaScript
    
      dog.eat();   // ๊ฒฐ๊ณผ: Eating...
      dog.sleep(); // ๊ฒฐ๊ณผ: Sleeping...
      dog.bark();  // ๊ฒฐ๊ณผ: Barking...
    
  

์ด ์˜ˆ์ œ์—์„œ dog ๊ฐ์ฒด๋Š” animal ๊ฐ์ฒด๋กœ๋ถ€ํ„ฐ eat()๊ณผ sleep() ๋ฉ”์†Œ๋“œ๋ฅผ ์ƒ์†๋ฐ›๊ณ  ์ž์‹ ๋งŒ์˜ bark() ๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด.

4.3 ๊นŠ์€ ํ”„๋กœํ† ํƒ€์ž…์„ ํ†ตํ•œ ์ƒ์†

ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ

JavaScript์—์„œ ๊ฐ์ฒด๋“ค์ด ์„œ๋กœ ์ƒ์†๋˜์–ด ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์„ ํ˜•์„ฑํ•  ๋•Œ ์ƒ์†์€ ๋” ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ์–ด.

ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ ์˜ˆ์ œ

์ด ์˜ˆ์ œ์—์„œ dog ๊ฐ์ฒด๋Š” mammal ๊ฐ์ฒด๋กœ๋ถ€ํ„ฐ ์ƒ์†๋ฐ›๊ณ , mammal์€ animal๋กœ๋ถ€ํ„ฐ ์ƒ์†๋ฐ›์•„. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด dog๋Š” mammal๊ณผ animal์˜ ๋ชจ๋“  ๋ฉ”์†Œ๋“œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์„ ์ƒ์„ฑํ•ด.

JavaScript
    
      const animal = {
        eat() {
          console.log('Eating...');
        }
      };

      const mammal = Object.create(animal);

      mammal.walk = function() {
        console.log('Walking...');
      };

      const dog = Object.create(mammal);
      dog.bark = function() {
        console.log('Barking...');
      };

      dog.eat();   // ๊ฒฐ๊ณผ: Eating...
      dog.walk();  // ๊ฒฐ๊ณผ: Walking...
      dog.bark();  // ๊ฒฐ๊ณผ: Barking...
    
  

ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ ํ™•์ธ

isPrototypeOf() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ์ฒด๊ฐ€ ๋‹ค๋ฅธ ๊ฐ์ฒด์˜ ํ”„๋กœํ† ํƒ€์ž…์ธ์ง€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด.

์˜ˆ์ œ:

JavaScript
    
      console.log(animal.isPrototypeOf(mammal)); // ๊ฒฐ๊ณผ: true
      console.log(mammal.isPrototypeOf(dog));    // ๊ฒฐ๊ณผ: true
      console.log(animal.isPrototypeOf(dog));    // ๊ฒฐ๊ณผ: true
    
  

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

ํ”„๋กœํ† ํƒ€์ž… ์ƒ์†์€ ์ƒˆ๋กœ์šด ๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ธฐ์กด ๋ฉ”์†Œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•ด.

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

์ด ์˜ˆ์ œ์—์„œ dog ๊ฐ์ฒด์˜ speak() ๋ฉ”์†Œ๋“œ๋Š” animal ๊ฐ์ฒด์˜ speak() ๋ฉ”์†Œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•ด.

JavaScript
    
      const animal = {
        speak() {
          console.log('Animal speaks');
        }
      };

      const dog = Object.create(animal);
      dog.speak = function() {
        console.log('Dog barks');
      };

      animal.speak(); // ๊ฒฐ๊ณผ: Animal speaks
      dog.speak();    // ๊ฒฐ๊ณผ: Dog barks
    
  

๋ถ€๋ชจ ๊ฐ์ฒด ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ

JavaScript์—์„œ ๋ถ€๋ชจ ๊ฐ์ฒด์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ ค๋ฉด call() ๋˜๋Š” apply() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด.

์˜ˆ์ œ:

JavaScript
    
      const animal = {
        speak() {
          console.log('Animal speaks');
        }
      };

      const dog = Object.create(animal);
      dog.speak = function() {
        animal.speak.call(this);
        console.log('Dog barks');
      };

      dog.speak();

      // ๊ฒฐ๊ณผ:
      // Animal speaks
      // Dog barks
    
  

4.5 ํ”„๋กœํ† ํƒ€์ž… ์ƒ์†์˜ ์‹ฌํ™”๋œ ์‚ฌ์šฉ๋ฒ•

๋‚ด์žฅ ๊ฐ์ฒด ํ™•์žฅ

JavaScript์˜ ๋‚ด์žฅ ๊ฐ์ฒด๋ฅผ ํ™•์žฅํ•˜์—ฌ ๊ทธ๋“ค์˜ ํ”„๋กœํ† ํƒ€์ž…์— ๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์–ด.

์˜ˆ์ œ:

JavaScript
    
      Array.prototype.sum = function() {
        return this.reduce((acc, value) => acc + value, 0);
      };

      const numbers = [1, 2, 3, 4, 5];

      console.log(numbers.sum()); // ๊ฒฐ๊ณผ: 15
    
  

๋‹ค๋‹จ๊ณ„ ๊ณ„์ธต ๊ตฌ์กฐ ์ƒ์„ฑ

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

์˜ˆ์ œ:

JavaScript
    
      const livingBeing = {
        breathe() {
          console.log('Breathing...');
        }
      };

      const animal = Object.create(livingBeing);
      animal.eat = function() {
        console.log('Eating...');
      };

      const mammal = Object.create(animal);
      mammal.walk = function() {
        console.log('Walking...');
      };

      const dog = Object.create(mammal);
      dog.bark = function() {
        console.log('Barking...');
      };

      dog.breathe(); // ๊ฒฐ๊ณผ: Breathing...
      dog.eat();     // ๊ฒฐ๊ณผ: Eating...
      dog.walk();    // ๊ฒฐ๊ณผ: Walking...
      dog.bark();    // ๊ฒฐ๊ณผ: Barking...
    
  
์ฝ”๋ฉ˜ํŠธ
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION