λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Language/Javascript

[Javascript]μžλ°”μŠ€ν¬λ¦½νŠΈ 상속 μ™„λ²½ κ°€μ΄λ“œ: κΈ°λ³Έ κ°œλ…λΆ€ν„° μ‹€μ „ μ˜ˆμ œκΉŒμ§€

by YJ Dev 2024. 6. 27.
728x90
λ°˜μ‘ν˜•
SMALL

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°(OOP)의 κ°•λ ₯ν•œ κΈ°λŠ₯을 μ§€μ›ν•˜λŠ” μ–Έμ–΄μž…λ‹ˆλ‹€. 특히 ν”„λ‘œν† νƒ€μž… 기반 상속 λ©”μ»€λ‹ˆμ¦˜μ„ 톡해 μ½”λ“œ μž¬μ‚¬μš©μ„±κ³Ό μœ μ—°μ„±μ„ 높일 수 μžˆμŠ΅λ‹ˆλ‹€. 이번 ν¬μŠ€νŒ…μ—μ„œλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ° κ°œλ…κ³Ό ν”„λ‘œν† νƒ€μž…μ„ ν™œμš©ν•œ 상속 방법에 λŒ€ν•΄ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈ 상속


01. μƒμ†μ˜ κΈ°λ³Έ κ°œλ…πŸ“š

상속(Inheritance)은 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ—μ„œ μ€‘μš”ν•œ κ°œλ… 쀑 ν•˜λ‚˜λ‘œ, 기쑴의 클래슀λ₯Ό μž¬μ‚¬μš©ν•˜μ—¬ μƒˆλ‘œμš΄ 클래슀λ₯Ό λ§Œλ“œλŠ” λ°©λ²•μž…λ‹ˆλ‹€. 상속을 톡해 μ½”λ“œμ˜ μž¬μ‚¬μš©μ„±μ„ 높이고, μœ μ§€λ³΄μˆ˜μ„±μ„ ν–₯상할 수 μžˆμŠ΅λ‹ˆλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” ν”„λ‘œν† νƒ€μž… 기반의 μ–Έμ–΄λ‘œ, λ‹€λ₯Έ 객체 지ν–₯ μ–Έμ–΄μ™€λŠ” λ‹€λ₯΄κ²Œ 상속을 κ΅¬ν˜„ν•©λ‹ˆλ‹€.


02. ν”„λ‘œν† νƒ€μž… 기반 상속 μ΄ν•΄ν•˜κΈ°πŸ”„

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” ν”„λ‘œν† νƒ€μž… 기반 μ–Έμ–΄λ‘œ, 객체가 λ‹€λ₯Έ 객체의 속성과 λ©”μ„œλ“œλ₯Ό 상속받을 수 μžˆλŠ” λ©”μ»€λ‹ˆμ¦˜μ„ μ œκ³΅ν•©λ‹ˆλ‹€. λͺ¨λ“  μžλ°”μŠ€ν¬λ¦½νŠΈ κ°μ²΄λŠ” μˆ¨κ²¨μ§„ ν”„λ‘œν† νƒ€μž… 속성을 가지며, 이λ₯Ό 톡해 상속을 κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν”„λ‘œν† νƒ€μž… 기반 μƒμ†μ˜ μ£Όμš” κ°œλ…κ³Ό 예제λ₯Ό μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

1. ν”„λ‘œν† νƒ€μž… 체인

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 각 κ°μ²΄λŠ” λ‹€λ₯Έ 객체λ₯Ό μ°Έμ‘°ν•˜λŠ” ν”„λ‘œν† νƒ€μž…(ν”„λ‘œν† )을 가지고 μžˆμŠ΅λ‹ˆλ‹€. 객체가 νŠΉμ • μ†μ„±μ΄λ‚˜ λ©”μ„œλ“œλ₯Ό 찾을 λ•Œ, λ¨Όμ € μžμ‹ μ΄ 가진 속성과 λ©”μ„œλ“œλ₯Ό κ²€μƒ‰ν•˜κ³ , μ‘΄μž¬ν•˜μ§€ μ•Šμ„ 경우 ν”„λ‘œν† νƒ€μž… 체인을 따라가며 μƒμœ„ 객체λ₯Ό κ²€μƒ‰ν•©λ‹ˆλ‹€. 이 과정을 톡해 κ°μ²΄λŠ” λ‹€λ₯Έ 객체의 속성과 λ©”μ„œλ“œλ₯Ό μƒμ†λ°›μŠ΅λ‹ˆλ‹€.


2. ν•¨μˆ˜ μƒμ„±μžμ™€ ν”„λ‘œν† νƒ€μž…

ν•¨μˆ˜ μƒμ„±μžλ₯Ό μ‚¬μš©ν•˜μ—¬ 객체λ₯Ό μƒμ„±ν•˜κ³ , ν”„λ‘œν† νƒ€μž…μ„ 톡해 상속을 κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν•¨μˆ˜ μƒμ„±μžλŠ” μƒˆλ‘œμš΄ 객체λ₯Ό λ§Œλ“€κΈ° μœ„ν•œ ν…œν”Œλ¦Ώ 역할을 ν•˜λ©°, μƒμ„±λœ κ°μ²΄λŠ” ν•΄λ‹Ή ν•¨μˆ˜ μƒμ„±μžμ˜ ν”„λ‘œν† νƒ€μž…μ„ μƒμ†λ°›μŠ΅λ‹ˆλ‹€.

function Animal(name) {
  this.name = name;
}

Animal.prototype.speak = function() {
  console.log(`${this.name}이(κ°€) μ†Œλ¦¬λ₯Ό λƒ…λ‹ˆλ‹€.`);
};

const dog = new Animal('강아지');
dog.speak(); // 강아지이(κ°€) μ†Œλ¦¬λ₯Ό λƒ…λ‹ˆλ‹€.

μœ„ μ˜ˆμ œμ—μ„œ Animal ν•¨μˆ˜ μƒμ„±μžλŠ” μƒˆλ‘œμš΄ 객체λ₯Ό μƒμ„±ν•˜λŠ” ν…œν”Œλ¦Ώ 역할을 ν•©λ‹ˆλ‹€. Animal.prototype에 μ •μ˜λœ speak λ©”μ„œλ“œλŠ” dog κ°μ²΄μ—μ„œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.


3. ν”„λ‘œν† νƒ€μž… 상속 κ΅¬ν˜„

ν”„λ‘œν† νƒ€μž…μ„ μ‚¬μš©ν•˜μ—¬ ν•œ 객체가 λ‹€λ₯Έ 객체λ₯Ό 상속받도둝 κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό μœ„ν•΄ Object.create λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μƒˆλ‘œμš΄ 객체λ₯Ό μƒμ„±ν•˜κ³ , ν•΄λ‹Ή 객체의 ν”„λ‘œν† νƒ€μž…μ„ μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

function Animal(name) {
  this.name = name;
}

Animal.prototype.speak = function() {
  console.log(`${this.name}이(κ°€) μ†Œλ¦¬λ₯Ό λƒ…λ‹ˆλ‹€.`);
};

function Dog(name) {
  Animal.call(this, name); // λΆ€λͺ¨ μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜μ—¬ 상속
}

Dog.prototype = Object.create(Animal.prototype); // ν”„λ‘œν† νƒ€μž… 체인을 μ„€μ •
Dog.prototype.constructor = Dog; // μƒμ„±μžλ₯Ό λ‹€μ‹œ μ„€μ •

Dog.prototype.speak = function() {
  console.log(`${this.name}이(κ°€) 멍멍 μ§–μŠ΅λ‹ˆλ‹€.`);
};

const dog = new Dog('강아지');
dog.speak(); // 강아지이(κ°€) 멍멍 μ§–μŠ΅λ‹ˆλ‹€.

μœ„ μ˜ˆμ œμ—μ„œ Dog μƒμ„±μžλŠ” Animal μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜μ—¬ name 속성을 μƒμ†λ°›μŠ΅λ‹ˆλ‹€. Dog.prototype은 Object.createλ₯Ό μ‚¬μš©ν•˜μ—¬ Animal.prototype을 상속받도둝 μ„€μ •λ˜μ—ˆκ³ , μƒμ„±μžλ₯Ό λ‹€μ‹œ Dog둜 μ„€μ •ν•˜μ—¬ μ˜¬λ°”λ₯Έ μ°Έμ‘°λ₯Ό μœ μ§€ν•©λ‹ˆλ‹€. 이후 Dog.prototype에 μƒˆλ‘œμš΄ speak λ©”μ„œλ“œλ₯Ό μ •μ˜ν•˜μ—¬ Animal의 speak λ©”μ„œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ“œν•©λ‹ˆλ‹€.


4. ν”„λ‘œν† νƒ€μž… 체인의 λ™μž‘ 방식

ν”„λ‘œν† νƒ€μž… 체인을 톡해 κ°μ²΄λŠ” μƒμœ„ 객체의 속성과 λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 객체가 νŠΉμ • μ†μ„±μ΄λ‚˜ λ©”μ„œλ“œλ₯Ό 찾지 λͺ»ν•˜λ©΄, ν”„λ‘œν† νƒ€μž… 체인을 따라 μƒμœ„ 객체둜 검색을 κ³„μ†ν•©λ‹ˆλ‹€.

console.log(dog instanceof Dog); // true
console.log(dog instanceof Animal); // true
console.log(dog instanceof Object); // true

μœ„ μ˜ˆμ œμ—μ„œ dog κ°μ²΄λŠ” Dog, Animal, Object의 μΈμŠ€ν„΄μŠ€μž…λ‹ˆλ‹€. μ΄λŠ” ν”„λ‘œν† νƒ€μž… 체인을 따라가며 상속 ꡬ쑰λ₯Ό 확인할 수 μžˆμŒμ„ λ³΄μ—¬μ€λ‹ˆλ‹€.


03. ES6 클래슀 μƒμ†πŸ†•

ECMAScript 6(ES6)μ—μ„œλŠ” 클래슀λ₯Ό μ‚¬μš©ν•˜μ—¬ 더 직관적이고 κ°„νŽΈν•˜κ²Œ 상속을 κ΅¬ν˜„ν•  수 μžˆλŠ” 문법을 λ„μž…ν–ˆμŠ΅λ‹ˆλ‹€. class와 extends ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ 클래슀λ₯Ό μ •μ˜ν•˜κ³  μƒμ†ν•˜λŠ” 방법을 μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.
μžλ°”μŠ€ν¬λ¦½νŠΈ ν΄λž˜μŠ€μ— κ΄€ν•œ λ‚΄μš©μ€ μ•„λž˜ ν¬μŠ€νŒ…μ„ μ°Έκ³ ν•΄ μ£Όμ„Έμš”πŸ˜

""

[μžλ°”μŠ€ν¬λ¦½νŠΈ]μžλ°”μŠ€ν¬λ¦½νŠΈ 클래슀 μ΄ν•΄ν•˜κΈ°

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ ν΄λž˜μŠ€λŠ” 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ„ κ΅¬ν˜„ν•˜λŠ” 데 맀우 μœ μš©ν•œ λ„κ΅¬μž…λ‹ˆλ‹€. ν΄λž˜μŠ€λŠ” 객체의 ꡬ쑰와 행동을 μ •μ˜ν•˜λŠ” 틀을 μ œκ³΅ν•˜λ©°, 이λ₯Ό 톡해 더 κΉ”λ”ν•˜κ³  κ΄€λ¦¬ν•˜κΈ° μ‰¬μš΄ μ½”λ“œ

creativevista.tistory.com

1. 클래슀 μ •μ˜ν•˜κΈ°

ES6μ—μ„œλŠ” class ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ 클래슀λ₯Ό μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν΄λž˜μŠ€λŠ” μƒμ„±μž(constructor)와 λ©”μ„œλ“œλ₯Ό 포함할 수 μžˆμŠ΅λ‹ˆλ‹€.

class Animal {
  constructor(name) {
    this.name = name;
  }

  speak() {
    console.log(`${this.name}이(κ°€) μ†Œλ¦¬λ₯Ό λƒ…λ‹ˆλ‹€.`);
  }
}

const animal = new Animal('동물');
animal.speak(); // 동물이(κ°€) μ†Œλ¦¬λ₯Ό λƒ…λ‹ˆλ‹€.

2. 클래슀 μƒμ†ν•˜κΈ°

클래슀λ₯Ό μƒμ†ν•˜λ €λ©΄ extends ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. μžμ‹ ν΄λž˜μŠ€λŠ” λΆ€λͺ¨ 클래슀의 λͺ¨λ“  속성과 λ©”μ„œλ“œλ₯Ό μƒμ†λ°›μœΌλ©°, ν•„μš”μ— 따라 λ©”μ„œλ“œλ₯Ό μž¬μ •μ˜(μ˜€λ²„λΌμ΄λ“œ)ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

class Dog extends Animal {
  speak() {
    console.log(`${this.name}이(κ°€) 멍멍 μ§–μŠ΅λ‹ˆλ‹€.`);
  }
}

const dog = new Dog('강아지');
dog.speak(); // 강아지이(κ°€) 멍멍 μ§–μŠ΅λ‹ˆλ‹€.

3. super ν‚€μ›Œλ“œ μ‚¬μš©ν•˜κΈ°

μžμ‹ ν΄λž˜μŠ€μ—μ„œ λΆ€λͺ¨ 클래슀의 μƒμ„±μžμ™€ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  λ•Œ super ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. superλŠ” λΆ€λͺ¨ 클래슀의 μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜κ±°λ‚˜ λΆ€λͺ¨ 클래슀의 λ©”μ„œλ“œλ₯Ό μ°Έμ‘°ν•  λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.

class Animal {
  constructor(name) {
    this.name = name;
  }

  speak() {
    console.log(`${this.name}이(κ°€) μ†Œλ¦¬λ₯Ό λƒ…λ‹ˆλ‹€.`);
  }
}

class Dog extends Animal {
  constructor(name, breed) {
    super(name); // λΆ€λͺ¨ 클래슀의 μƒμ„±μž 호좜
    this.breed = breed;
  }

  speak() {
    super.speak(); // λΆ€λͺ¨ 클래슀의 λ©”μ„œλ“œ 호좜
    console.log(`${this.name}이(κ°€) 멍멍 μ§–μŠ΅λ‹ˆλ‹€.`);
  }
}

const dog = new Dog('강아지', 'μ§„λ—κ°œ');
dog.speak();
// 강아지이(κ°€) μ†Œλ¦¬λ₯Ό λƒ…λ‹ˆλ‹€.
// 강아지이(κ°€) 멍멍 μ§–μŠ΅λ‹ˆλ‹€.
console.log(dog.breed); // μ§„λ—κ°œ

4. 클래슀 μƒμ†μ˜ μ‹€μ „ 예제

λ‹€μŒμ€ 과일 ν΄λž˜μŠ€μ™€ 상속을 μ‚¬μš©ν•˜μ—¬ 빨간색 과일과 μ΄ˆλ‘μƒ‰ 과일을 κ΅¬λΆ„ν•˜λŠ” μ˜ˆμ œμž…λ‹ˆλ‹€.

class Fruit {
  constructor(korean, english) {
    this.korean = korean;
    this.english = english;
  }

  describe() {
    return `${this.korean} (${this.english})`;
  }
}

class RedFruit extends Fruit {
  color() {
    return '빨간색 κ³ΌμΌμž…λ‹ˆλ‹€.';
  }
}

class GreenFruit extends Fruit {
  color() {
    return 'μ΄ˆλ‘μƒ‰ κ³ΌμΌμž…λ‹ˆλ‹€.';
  }
}

const strawberry = new RedFruit('λ”ΈκΈ°', 'strawberry');
console.log(strawberry.describe()); // λ”ΈκΈ° (strawberry)
console.log(strawberry.color()); // 빨간색 κ³ΌμΌμž…λ‹ˆλ‹€.

const watermelon = new GreenFruit('μˆ˜λ°•', 'watermelon');
console.log(watermelon.describe()); // μˆ˜λ°• (watermelon)
console.log(watermelon.color()); // μ΄ˆλ‘μƒ‰ κ³ΌμΌμž…λ‹ˆλ‹€.

04. 상속 예제: μ‹€μ „ μ½”λ“œπŸ’»

μžλ°”μŠ€ν¬λ¦½νŠΈ 상속을 ν™œμš©ν•œ μ‹€μ „ 예제λ₯Ό μ‚΄νŽ΄λ΄…λ‹ˆλ‹€. λ¨Όμ € ν”„λ‘œν† νƒ€μž… 기반 상속을 톡해 객체λ₯Ό ν™•μž₯ν•˜λŠ” 방법을 λ³΄κ² μŠ΅λ‹ˆλ‹€.

// ν”„λ‘œν† νƒ€μž… 기반 상속 μ‹€μ „ 예제
function Vehicle(make, model) {
  this.make = make;
  this.model = model;
}

Vehicle.prototype.getDetails = function() {
  return `${this.make} ${this.model}`;
};

function Car(make, model, doors) {
  Vehicle.call(this, make, model);
  this.doors = doors;
}

Car.prototype = Object.create(Vehicle.prototype);
Car.prototype.constructor = Car;

Car.prototype.getDetails = function() {
  return `${this.make} ${this.model}, ${this.doors} doors`;
};

const car = new Car('Toyota', 'Corolla', 4);
console.log(car.getDetails()); // Toyota Corolla, 4 doors

05. μƒμ†μ˜ μž₯단점 λΆ„μ„βš–οΈ

μžλ°”μŠ€ν¬λ¦½νŠΈ 상속은 μ½”λ“œμ˜ μž¬μ‚¬μš©μ„±μ„ 높이고, ꡬ쑰적인 ν”„λ‘œκ·Έλž˜λ°μ„ κ°€λŠ₯ν•˜κ²Œ ν•˜λŠ” μ€‘μš”ν•œ κΈ°λŠ₯μž…λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 상속을 μ‚¬μš©ν•  λ•ŒλŠ” μ£Όμ˜ν•΄μ•Ό ν•  점도 μžˆμŠ΅λ‹ˆλ‹€. μ—¬κΈ°μ„œλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ μƒμ†μ˜ μž₯단점을 μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

μž₯점

1. μ½”λ“œ μž¬μ‚¬μš©μ„± 증가

  • 상속을 톡해 κ³΅ν†΅λœ κΈ°λŠ₯을 λΆ€λͺ¨ ν΄λž˜μŠ€μ— μ •μ˜ν•˜κ³ , 이λ₯Ό μžμ‹ ν΄λž˜μŠ€μ—μ„œ μž¬μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해 μ½”λ“œ 쀑볡을 쀄이고, μœ μ§€λ³΄μˆ˜κ°€ μš©μ΄ν•΄μ§‘λ‹ˆλ‹€.

2. ꡬ쑰적이고 읽기 μ‰¬μš΄ μ½”λ“œ μž‘μ„± κ°€λŠ₯

  • 상속을 μ‚¬μš©ν•˜λ©΄ 클래슀 κ°„μ˜ 관계가 λͺ…확해지고, μ½”λ“œμ˜ ꡬ쑰가 체계적이며 읽기 μ‰½κ²Œ λ©λ‹ˆλ‹€. μ΄λŠ” ν˜‘μ—… μ‹œ μ½”λ“œμ˜ 이해도와 μœ μ§€λ³΄μˆ˜μ„±μ„ λ†’μ΄λŠ” 데 도움이 λ©λ‹ˆλ‹€.

3. μœ μ§€λ³΄μˆ˜μ„± ν–₯상

  • κ³΅ν†΅λœ κΈ°λŠ₯을 λΆ€λͺ¨ ν΄λž˜μŠ€μ— μ •μ˜ν•˜λ©΄, ν•΄λ‹Ή κΈ°λŠ₯을 μˆ˜μ •ν•  λ•Œ λͺ¨λ“  μžμ‹ ν΄λž˜μŠ€μ—μ„œ μžλ™μœΌλ‘œ μ μš©λ©λ‹ˆλ‹€. 이λ₯Ό 톡해 μœ μ§€λ³΄μˆ˜κ°€ μš©μ΄ν•΄μ§€κ³ , 일관성을 μœ μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

단점

1. κ³Όλ„ν•œ 상속 κ΅¬μ‘°λŠ” λ³΅μž‘λ„λ₯Ό μ¦κ°€μ‹œν‚΄

  • 상속 ꡬ쑰가 λ„ˆλ¬΄ κΉŠκ±°λ‚˜ λ³΅μž‘ν•˜λ©΄ μ½”λ“œμ˜ 이해도가 떨어지고, 디버깅이 μ–΄λ €μ›Œμ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ 상속은 ν•„μš”ν•  λ•Œ 적절히 μ‚¬μš©ν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€.

2. 닀쀑 상속이 λΆˆκ°€λŠ₯

  • μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 닀쀑 상속을 μ§€μ›ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ μ—¬λŸ¬ 클래슀의 κΈ°λŠ₯을 λ™μ‹œμ— 상속받아야 ν•  λ•ŒλŠ” 믹슀인 νŒ¨ν„΄μ„ μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.
const canFly = {
  fly() {
    console.log('λ‚ κ³  μžˆμŠ΅λ‹ˆλ‹€.');
  }
};

const canSwim = {
  swim() {
    console.log('μˆ˜μ˜ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.');
  }
};

class Animal {
  constructor(name) {
    this.name = name;
  }
}

class Duck extends Animal {
  constructor(name) {
    super(name);
  }
}

Object.assign(Duck.prototype, canFly, canSwim);

const duck = new Duck('였리');
duck.fly(); // λ‚ κ³  μžˆμŠ΅λ‹ˆλ‹€.
duck.swim(); // μˆ˜μ˜ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.


3. μƒμ†μ˜ 였용 κ°€λŠ₯μ„±

  • λͺ¨λ“  κ²½μš°μ— 상속을 μ‚¬μš©ν•˜λŠ” 것은 λ°”λžŒμ§ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 상속은 "is-a" 관계(ν•œ 객체가 λ‹€λ₯Έ 객체의 일쒅일 λ•Œ)λ₯Ό λ‚˜νƒ€λ‚Ό λ•Œ μ‚¬μš©ν•΄μ•Ό ν•˜λ©°, "has-a" 관계(ν•œ 객체가 λ‹€λ₯Έ 객체λ₯Ό ν¬ν•¨ν•˜κ³  μžˆμ„ λ•Œ)λŠ” μ‘°ν•©(Composition)을 톡해 κ΅¬ν˜„ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.
class Engine {
  start() {
    console.log('엔진을 μ‹œμž‘ν•©λ‹ˆλ‹€.');
  }
}

class Car {
  constructor(engine) {
    this.engine = engine;
  }

  start() {
    this.engine.start();
  }
}

const engine = new Engine();
const car = new Car(engine);
car.start(); // 엔진을 μ‹œμž‘ν•©λ‹ˆλ‹€. 
728x90
λ°˜μ‘ν˜•