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

[Javascript]μžλ°”μŠ€ν¬λ¦½νŠΈ ν”„λ‘œν† νƒ€μž… 체인 μ΄ν•΄ν•˜κΈ°: μ΄ˆλ³΄μžλ„ μ‰½κ²Œ λ°°μš°λŠ” 방법

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

μžλ°”μŠ€ν¬λ¦½νŠΈ ν”„λ‘œν† νƒ€μž… 체인은 μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ—μ„œ 핡심적인 κ°œλ…μž…λ‹ˆλ‹€. 이 κΈ€μ—μ„œλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ μ΄ˆλ³΄μžλ„ μ‰½κ²Œ 이해할 수 μžˆλ„λ‘ ν”„λ‘œν† νƒ€μž… 체인에 λŒ€ν•΄ μžμ„Ένžˆ μ„€λͺ…ν•˜κ² μŠ΅λ‹ˆλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈ ν”„λ‘œν† νƒ€μž… 체인


μžλ°”μŠ€ν¬λ¦½νŠΈ 객체에 λŒ€ν•œ λ‚΄μš©μ€ μ•„λž˜ ν¬μŠ€νŒ…μ„ μ°Έκ³ ν•΄ μ£Όμ„Έμš”πŸ˜

""

[Javascript]μžλ°”μŠ€ν¬λ¦½νŠΈ 객체 μ™„λ²½ κ°€μ΄λ“œ: μ„ μ–Έ, μ‚¬μš©λ²•, 볡사

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ 객체(Object)λŠ” 맀우 μ€‘μš”ν•œ κ°œλ…μž…λ‹ˆλ‹€. κ°μ²΄λŠ” λ‹€μ–‘ν•œ 데이터λ₯Ό ν•˜λ‚˜μ˜ ꡬ쑰둜 λ¬Άμ–΄ 관리할 수 있게 ν•΄ μ€λ‹ˆλ‹€. 이 κΈ€μ—μ„œλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ 객체에 λŒ€ν•œ κΈ°λ³Έ κ°œλ…λΆ€ν„° κ³ κΈ‰ ν™œ

creativevista.tistory.com


01. ν”„λ‘œν† νƒ€μž…μ˜ κ°œλ… μ΄ν•΄ν•˜κΈ°πŸ“š

ν”„λ‘œν† νƒ€μž…μ΄λž€ 무엇인가

ν”„λ‘œν† νƒ€μž…(prototype)은 μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ„ κ΅¬ν˜„ν•˜λŠ” 데 μ€‘μš”ν•œ 역할을 ν•©λ‹ˆλ‹€. λͺ¨λ“  μžλ°”μŠ€ν¬λ¦½νŠΈ κ°μ²΄λŠ” ν”„λ‘œν† νƒ€μž…μ΄λΌλŠ” μˆ¨κ²¨μ§„ 속성을 가지고 있으며, 이 속성은 λ‹€λ₯Έ 객체λ₯Ό μ°Έμ‘°ν•©λ‹ˆλ‹€. 이 참쑰된 κ°μ²΄λŠ” ν•΄λ‹Ή 객체의 ν”„λ‘œν† νƒ€μž…μœΌλ‘œ 뢈리며, ν”„λ‘œν† νƒ€μž… κ°μ²΄λŠ” 속성과 λ©”μ„œλ“œλ₯Ό 포함할 수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해 κ°μ²΄λŠ” ν”„λ‘œν† νƒ€μž…μœΌλ‘œλΆ€ν„° 속성과 λ©”μ„œλ“œλ₯Ό 상속받을 수 μžˆμŠ΅λ‹ˆλ‹€.


μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ 객체 생성과 ν”„λ‘œν† νƒ€μž…μ˜ 관계

λͺ¨λ“  μžλ°”μŠ€ν¬λ¦½νŠΈ κ°μ²΄λŠ” μžμ‹ μ˜ ν”„λ‘œν† νƒ€μž… 객체λ₯Ό κ°€λ¦¬ν‚€λŠ” λ‚΄λΆ€ 링크λ₯Ό 가지고 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, function Person() {}와 같은 μƒμ„±μž ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λ©΄, 이 ν•¨μˆ˜μ˜ prototype 속성이 μƒˆλ‘œμš΄ 객체의 ν”„λ‘œν† νƒ€μž…μ΄ λ©λ‹ˆλ‹€.

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

Person.prototype.greet = function() {
  console.log(`Hello, my name is ${this.name}`);
};

const alice = new Person('Alice');
alice.greet(); // "Hello, my name is Alice"

ν”„λ‘œν† νƒ€μž…κ³Ό proto 차이점

__proto__λŠ” 객체 κ°„μ˜ 상속 관계λ₯Ό λ‚˜νƒ€λ‚΄λ©°, prototype은 ν•¨μˆ˜ 객체가 생성할 객체의 κΈ°λ³Έ ꡬ쑰(ν”„λ‘œν† νƒ€μž…)λ₯Ό μ •μ˜ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€.

const exampleObj = {};

// __proto__λŠ” λͺ¨λ“  객체에 μ‘΄μž¬ν•˜λ©°, μƒμ†μ—μ„œ λΆ€λͺ¨ 객체λ₯Ό κ°€λ¦¬ν‚΅λ‹ˆλ‹€.
console.log(exampleObj.__proto__);
function Person(name, age) {
  this.name = name;
  this.age = age;
}

console.log(Person.prototype);

ν”„λ‘œν† νƒ€μž…μ˜ κΈ°λ³Έ ꡬ쑰

λͺ¨λ“  ν•¨μˆ˜ κ°μ²΄λŠ” prototype ν”„λ‘œνΌν‹°λ₯Ό 가지고 있으며, 이λ₯Ό 톡해 μƒμ„±λ˜λŠ” κ°μ²΄λŠ” 이 ν”„λ‘œν† νƒ€μž…μ„ μƒμ†λ°›μŠ΅λ‹ˆλ‹€.

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

console.log(Animal.prototype); // {}
console.log(Animal.prototype.constructor === Animal); // true
const dog = new Animal("Dog");

console.log(dog.__proto__); // Animal.prototype
console.log(dog.__proto__ === Animal.prototype); // true

02. ν”„λ‘œν† νƒ€μž… μ²΄μΈμ΄λž€?πŸ”—

ν”„λ‘œν† νƒ€μž… 체인의 μ •μ˜

ν”„λ‘œν† νƒ€μž… μ²΄μΈμ΄λž€ 객체가 μžμ‹ μ˜ ν”„λ‘œν† νƒ€μž…μ„ 톡해 λ‹€λ₯Έ 객체의 속성과 λ©”μ„œλ“œλ₯Ό μƒμ†λ°›λŠ” ꡬ쑰λ₯Ό λ§ν•©λ‹ˆλ‹€. μ΄λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 상속 λ©”μ»€λ‹ˆμ¦˜μ„ μ΄ν•΄ν•˜λŠ” 데 맀우 μ€‘μš”ν•©λ‹ˆλ‹€.


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

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ 객체의 ν”„λ‘œνΌν‹°λ‚˜ λ©”μ„œλ“œμ— μ ‘κ·Όν•  λ•Œ, ν•΄λ‹Ή 객체에 μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©΄ ν”„λ‘œν† νƒ€μž… 체인을 따라가며 μƒμœ„ ν”„λ‘œν† νƒ€μž… κ°μ²΄μ—μ„œ ν•΄λ‹Ή ν”„λ‘œνΌν‹°λ₯Ό μ°ΎμŠ΅λ‹ˆλ‹€. μ΅œμƒμœ„μ—λŠ” Object.prototype이 있으며, μ—¬κΈ°μ„œλ„ 찾을 수 μ—†μœΌλ©΄ undefinedλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

const testObj = {};
console.log(testObj.__proto__); // Object.prototype

function Student(name, year) {
  this.name = name;
  this.year = year;
}

console.log(Student.prototype); // Student {}

const alice = new Student('Alice', 2003);
console.log(alice.__proto__ === Student.prototype); // true

μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œμ™€ ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œμ˜ 차이

μΈμŠ€ν„΄μŠ€λ§ˆλ‹€ λ©”μ„œλ“œλ₯Ό μ •μ˜ν•˜λ©΄ λ©”λͺ¨λ¦¬ λ‚­λΉ„κ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό ν”Όν•˜κΈ° μœ„ν•΄ ν”„λ‘œν† νƒ€μž…μ— λ©”μ„œλ“œλ₯Ό μ •μ˜ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œλŠ” 객체의 ν”„λ‘œν† νƒ€μž…(prototype)에 μ •μ˜λœ λ©”μ„œλ“œμž…λ‹ˆλ‹€. 이 λ©”μ„œλ“œλ“€μ€ λͺ¨λ“  ν•΄λ‹Ή 객체의 μΈμŠ€ν„΄μŠ€μ—μ„œ κ³΅μœ λ©λ‹ˆλ‹€. 즉, λͺ¨λ“  객체 μΈμŠ€ν„΄μŠ€κ°€ λ™μΌν•œ λ©”μ„œλ“œ μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•˜κ²Œ λ©λ‹ˆλ‹€.

function Car(make, model) {
  this.make = make;
  this.model = model;

  this.start = function () {
    return `${this.make} ${this.model} is starting!`;
  };
}

const car1 = new Car("Toyota", "Corolla");
const car2 = new Car("Honda", "Civic");

console.log(car1.start()); // "Toyota Corolla is starting!"
console.log(car2.start()); // "Honda Civic is starting!"
console.log(car1.start === car2.start); // false

μœ„μ™€ 같은 방식은 λ©”λͺ¨λ¦¬λ₯Ό λ‚­λΉ„ν•˜κ²Œ λ©λ‹ˆλ‹€. 이λ₯Ό κ°œμ„ ν•˜λ €λ©΄ ν”„λ‘œν† νƒ€μž…μ— λ©”μ„œλ“œλ₯Ό μ •μ˜ν•©λ‹ˆλ‹€.

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

Car.prototype.start = function () {
  return `${this.make} ${this.model} is starting!`;
};

const car1 = new Car("Toyota", "Corolla");
const car2 = new Car("Honda", "Civic");

console.log(car1.start()); // "Toyota Corolla is starting!"
console.log(car2.start()); // "Honda Civic is starting!"
console.log(car1.start === car2.start); // true

이 경우, start λ©”μ„œλ“œλŠ” λͺ¨λ“  Car μΈμŠ€ν„΄μŠ€κ°€ κ³΅μœ ν•˜κ²Œ λ˜μ–΄ λ©”λͺ¨λ¦¬ 효율이 κ°œμ„ λ©λ‹ˆλ‹€.


λ©”μ„œλ“œ μ˜€λ²„λΌμ΄λ”©κ³Ό ν”„λ‘œνΌν‹° μ‰λ„μž‰

  • λ©”μ„œλ“œ μ˜€λ²„λΌμ΄λ”©: 상속 κ΄€κ³„μ—μ„œ μžμ‹ ν΄λž˜μŠ€κ°€ λΆ€λͺ¨ 클래슀의 λ™μΌν•œ μ΄λ¦„μ˜ λ©”μ„œλ“œλ₯Ό μž¬μ •μ˜(override)ν•˜λŠ” 것을 λ§ν•©λ‹ˆλ‹€. 이λ₯Ό 톡해 μžμ‹ ν΄λž˜μŠ€λŠ” λΆ€λͺ¨ 클래슀의 λ™μž‘μ„ λ³€κ²½ν•˜κ±°λ‚˜ ν™•μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” ν”„λ‘œν† νƒ€μž… 체인을 μ΄μš©ν•˜μ—¬ λ©”μ„œλ“œ μ˜€λ²„λΌμ΄λ”©μ„ κ΅¬ν˜„ν•©λ‹ˆλ‹€.

  • ν”„λ‘œνΌν‹° μ‰λ„μž‰: ν”„λ‘œνΌν‹° μ‰λ„μž‰μ€ 상속 κ΄€κ³„μ—μ„œ μžμ‹ ν΄λž˜μŠ€κ°€ λΆ€λͺ¨ 클래슀의 ν”„λ‘œνΌν‹°μ™€ λ™μΌν•œ μ΄λ¦„μ˜ ν”„λ‘œνΌν‹°λ₯Ό μ •μ˜ν•˜λŠ” 것을 λ§ν•©λ‹ˆλ‹€. μ΄λ•Œ, μžμ‹ 클래슀의 ν”„λ‘œνΌν‹°κ°€ λΆ€λͺ¨ 클래슀의 ν”„λ‘œνΌν‹°λ₯Ό "κ°€λ¦¬κ²Œ" λ˜μ–΄, λΆ€λͺ¨ 클래슀의 ν”„λ‘œνΌν‹°μ— 직접 μ ‘κ·Όν•  수 μ—†κ²Œ λ©λ‹ˆλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œκ°€ ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œλ³΄λ‹€ μš°μ„ μ‹œλ©λ‹ˆλ‹€.

function Bird(type) {
  this.type = type;
  this.fly = function () {
    return "Flying!";
  };
}

Bird.prototype.fly = function () {
  return "Soaring in the sky!";
};

const eagle = new Bird("Eagle");
console.log(eagle.fly()); // "Flying!" - μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œκ°€ μš°μ„ μ‹œλ©λ‹ˆλ‹€.

μœ„ μ˜ˆμ œμ—μ„œ eagle κ°μ²΄λŠ” μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œλ‘œ μ •μ˜λœ fly λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. ν”„λ‘œν† νƒ€μž…μ— μ •μ˜λœ fly λ©”μ„œλ“œλŠ” λ¬΄μ‹œλ©λ‹ˆλ‹€.


getPrototypeOf와 setPrototypeOf μ‚¬μš©ν•˜κΈ°

Object.getPrototypeOf와 Object.setPrototypeOf λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ ν”„λ‘œν† νƒ€μž…μ„ μ‘°νšŒν•˜κ³  λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

function Vehicle(type) {
  this.type = type;
}

Vehicle.prototype.drive = function () {
  return `${this.type} is driving!`;
};

function Bike(type) {
  this.type = type;
}

const myVehicle = new Vehicle("Car");
const myBike = new Bike("Mountain Bike");

console.log(Object.getPrototypeOf(myBike) === Bike.prototype); // true

Object.setPrototypeOf(myBike, Vehicle.prototype);
console.log(myBike.drive()); // "Mountain Bike is driving!"

03. ν”„λ‘œν† νƒ€μž… 체인의 ν™œμš© λ°©λ²•πŸ› οΈ

ν”„λ‘œν† νƒ€μž… 체인은 μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ„ κ΅¬ν˜„ν•˜λŠ” μ€‘μš”ν•œ λ„κ΅¬μž…λ‹ˆλ‹€. 이λ₯Ό ν™œμš©ν•˜μ—¬ 객체의 상속, λ©”μ„œλ“œ 곡유, μ½”λ“œ μž¬μ‚¬μš©μ„±μ„ 높일 수 μžˆμŠ΅λ‹ˆλ‹€. ν”„λ‘œν† νƒ€μž… 체인을 효과적으둜 ν™œμš©ν•˜λŠ” 방법을 λͺ‡ 가지 μ†Œκ°œν•©λ‹ˆλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈ 상속에 κ΄€ν•œ λ‚΄μš©μ€ μ•„λž˜ ν¬μŠ€νŒ…μ„ μ°Έκ³ ν•΄ μ£Όμ„Έμš”πŸ‘€

""

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

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

creativevista.tistory.com

1. ν”„λ‘œν† νƒ€μž…μ„ μ΄μš©ν•œ 상속

ν”„λ‘œν† νƒ€μž… 체인을 ν™œμš©ν•˜μ—¬ 객체 κ°„μ˜ 상속을 κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해 μ½”λ“œ μž¬μ‚¬μš©μ„±μ„ 높이고, 객체 κ°„μ˜ 관계λ₯Ό λͺ…ν™•ν•˜κ²Œ μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

예제: 상속 κ΅¬ν˜„

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

Animal.prototype.speak = function() {
  console.log(`${this.name} makes a noise.`);
};

function Dog(name, breed) {
  Animal.call(this, name);
  this.breed = breed;
}

// Dog의 ν”„λ‘œν† νƒ€μž…μ„ Animal의 ν”„λ‘œν† νƒ€μž…μœΌλ‘œ μ„€μ •
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;

Dog.prototype.bark = function() {
  console.log(`${this.name} barks.`);
};

const rex = new Dog('Rex', 'German Shepherd');
rex.speak(); // "Rex makes a noise."
rex.bark();  // "Rex barks."

2. λ©”μ„œλ“œ 곡유λ₯Ό ν†΅ν•œ λ©”λͺ¨λ¦¬ μ ˆμ•½

ν”„λ‘œν† νƒ€μž… 체인을 μ΄μš©ν•˜λ©΄ 각 객체 μΈμŠ€ν„΄μŠ€λ§ˆλ‹€ λ©”μ„œλ“œλ₯Ό 쀑볡 μ •μ˜ν•˜μ§€ μ•Šκ³ λ„ λ©”μ„œλ“œλ₯Ό κ³΅μœ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해 λ©”λͺ¨λ¦¬λ₯Ό μ ˆμ•½ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

예제: λ©”μ„œλ“œ 곡유

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

Car.prototype.start = function() {
  console.log(`${this.make} ${this.model} is starting!`);
};

const car1 = new Car("Toyota", "Corolla");
const car2 = new Car("Honda", "Civic");

console.log(car1.start === car2.start); // true
car1.start(); // "Toyota Corolla is starting!"
car2.start(); // "Honda Civic is starting!"

3. 객체 쑰립(Composition) νŒ¨ν„΄

상속보닀 객체 쑰립(Composition) νŒ¨ν„΄μ„ μ‚¬μš©ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. 이 νŒ¨ν„΄μ—μ„œλŠ” μž‘μ€ κΈ°λŠ₯ λ‹¨μœ„μ˜ 객체듀을 μ‘°λ¦½ν•˜μ—¬ 더 λ³΅μž‘ν•œ 객체λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. 이λ₯Ό 톡해 μœ μ—°ν•˜κ³  μž¬μ‚¬μš© κ°€λŠ₯ν•œ μ½”λ“œ ꡬ쑰λ₯Ό λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

예제: 객체 쑰립

const canEat = {
  eat() {
    console.log(`${this.name} is eating.`);
  }
};

const canWalk = {
  walk() {
    console.log(`${this.name} is walking.`);
  }
};

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

Object.assign(Person.prototype, canEat, canWalk);

const john = new Person('John');
john.eat();  // "John is eating."
john.walk(); // "John is walking."

4. ν”„λ‘œν† νƒ€μž… 체인을 ν†΅ν•œ λ©”μ„œλ“œ μ˜€λ²„λΌμ΄λ”©

ν”„λ‘œν† νƒ€μž… 체인을 μ΄μš©ν•˜μ—¬ μžμ‹ κ°μ²΄μ—μ„œ λΆ€λͺ¨ 객체의 λ©”μ„œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ“œν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해 객체의 λ™μž‘μ„ μž¬μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

예제: λ©”μ„œλ“œ μ˜€λ²„λΌμ΄λ”©

function Bird(type) {
  this.type = type;
}

Bird.prototype.fly = function() {
  console.log(`${this.type} is flying.`);
};

function Eagle(type) {
  Bird.call(this, type);
}

Eagle.prototype = Object.create(Bird.prototype);
Eagle.prototype.constructor = Eagle;

Eagle.prototype.fly = function() {
  console.log(`${this.type} is soaring high.`);
};

const myEagle = new Eagle('Eagle');
myEagle.fly(); // "Eagle is soaring high."

5. ES6 클래슀 문법 ν™œμš©

ES6 클래슀 문법은 ν”„λ‘œν† νƒ€μž… 체인을 보닀 μ§κ΄€μ μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλ„λ‘ λ„μ™€μ€λ‹ˆλ‹€. 이λ₯Ό 톡해 클래슀λ₯Ό μ •μ˜ν•˜κ³  상속 ꡬ쑰λ₯Ό μ‰½κ²Œ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

예제: ES6 클래슀

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

  speak() {
    console.log(`${this.name} makes a noise.`);
  }
}

class Dog extends Animal {
  constructor(name, breed) {
    super(name);
    this.breed = breed;
  }

  bark() {
    console.log(`${this.name} barks.`);
  }
}

const rex = new Dog('Rex', 'German Shepherd');
rex.speak(); // "Rex makes a noise."
rex.bark();  // "Rex barks."


μžλ°”μŠ€ν¬λ¦½νŠΈ ν΄λž˜μŠ€μ— κ΄€ν•œ λ‚΄μš©μ€ μ•„λž˜ ν¬μŠ€νŒ…μ„ μ°Έκ³ ν•΄ μ£Όμ„Έμš”πŸ‘‡

""

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

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

creativevista.tistory.com


04. ν”„λ‘œν† νƒ€μž… 체인의 문제점 및 ν•΄κ²° λ°©λ²•πŸ§

문제점

1. μ„±λŠ₯ 문제: ν”„λ‘œν† νƒ€μž… 체인을 톡해 μƒμ†λœ μ†μ„±μ΄λ‚˜ λ©”μ„œλ“œλ₯Ό μ ‘κ·Όν•  λ•Œ, 체인이 κΈΈμ–΄μ§ˆμˆ˜λ‘ 속성을 μ°ΎκΈ° μœ„ν•΄ λ§Žμ€ μ‹œκ°„μ΄ μ†Œμš”λ  수 μžˆμŠ΅λ‹ˆλ‹€. 특히, 체인이 κΉŠμ„μˆ˜λ‘ μ΄λŸ¬ν•œ λ¬Έμ œκ°€ μ‹¬ν™”λ©λ‹ˆλ‹€.


2. 상속 ꡬ쑰의 λ³΅μž‘μ„±
: ν”„λ‘œν† νƒ€μž… 체인을 ν™œμš©ν•œ 닀쀑 μƒμ†μ΄λ‚˜ λ³΅μž‘ν•œ 상속 κ΅¬μ‘°λŠ” μ½”λ“œμ˜ 가독성을 λ–¨μ–΄λœ¨λ¦¬κ³ , μœ μ§€λ³΄μˆ˜λ₯Ό μ–΄λ ΅κ²Œ λ§Œλ“­λ‹ˆλ‹€. 상속 계측이 κΉŠμ–΄μ§ˆμˆ˜λ‘ 디버깅이 μ–΄λ €μ›Œμ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.


3. 객체 곡유 문제
: ν”„λ‘œν† νƒ€μž… 체인을 톡해 μƒμ†λœ 객체의 속성이 μ°Έμ‘° νƒ€μž…(예: λ°°μ—΄, 객체)인 경우, λͺ¨λ“  μΈμŠ€ν„΄μŠ€κ°€ 같은 μ°Έμ‘°λ₯Ό κ³΅μœ ν•˜κ²Œ λ˜μ–΄ 예기치 μ•Šμ€ 버그가 λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.


4. ν”„λ‘œν† νƒ€μž… 체인의 동적 νŠΉμ„±
: ν”„λ‘œν† νƒ€μž… 체인은 λ™μ μœΌλ‘œ 변경될 수 μžˆμ–΄, μ˜λ„μΉ˜ μ•Šκ²Œ ν”„λ‘œν† νƒ€μž…μ΄ λ³€κ²½λ˜λ©΄ 예기치 μ•Šμ€ λ™μž‘μ΄ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.


ν•΄κ²° 방법

1. ES6 클래슀 μ‚¬μš©: ES6μ—μ„œ λ„μž…λœ class 문법을 μ‚¬μš©ν•˜λ©΄ 더 직관적이고 λͺ…ν™•ν•œ 상속 ꡬ쑰λ₯Ό λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€. 클래슀 문법을 μ‚¬μš©ν•˜λ©΄ ν”„λ‘œν† νƒ€μž… 체인을 직접 λ‹€λ£¨λŠ” 것보닀 κ°„λ‹¨ν•˜κ³ , μ½”λ“œ 가독성도 ν–₯μƒλ©λ‹ˆλ‹€.

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

    sayHello() {
        console.log(`Hello, my name is ${this.name}`);
    }
}

class Child extends Parent {
    constructor(name, age) {
        super(name);
        this.age = age;
    }

    sayAge() {
        console.log(`I am ${this.age} years old`);
    }
}

const child = new Child('John', 25);
child.sayHello();  // Hello, my name is John
child.sayAge();    // I am 25 years old


2. 객체 볡사: 객체의 속성이 μ°Έμ‘° νƒ€μž…μΌ 경우, μƒˆλ‘œμš΄ 객체λ₯Ό 생성할 λ•Œ 볡사본을 λ§Œλ“€μ–΄ 각 μΈμŠ€ν„΄μŠ€κ°€ 독립적인 속성을 갖도둝 ν•©λ‹ˆλ‹€. 이λ₯Ό 톡해 μ°Έμ‘° 곡유 문제λ₯Ό 방지할 수 μžˆμŠ΅λ‹ˆλ‹€.

class Parent {
    constructor(items) {
        this.items = [...items];  // λ°°μ—΄μ˜ 볡사본 생성
    }
}

const parent1 = new Parent([1, 2, 3]);
const parent2 = new Parent([4, 5, 6]);

parent1.items.push(4);
console.log(parent1.items); // [1, 2, 3, 4]
console.log(parent2.items); // [4, 5, 6]


3. Composition over Inheritance: 상속보닀 μ»΄ν¬μ§€μ…˜(ꡬ성)을 ν™œμš©ν•˜μ—¬ 객체λ₯Ό μ‘°λ¦½ν•˜λŠ” λ°©μ‹μœΌλ‘œ μ½”λ“œ μž¬μ‚¬μš©μ„±μ„ λ†’μž…λ‹ˆλ‹€. μ΄λŠ” μƒμ†μœΌλ‘œ μΈν•œ λ³΅μž‘μ„±μ„ 쀄이고, μœ μ—°μ„±μ„ μ¦κ°€μ‹œν‚΅λ‹ˆλ‹€.

const sayHelloMixin = (obj) => {
    obj.sayHello = function() {
        console.log(`Hello, my name is ${this.name}`);
    };
};

const sayAgeMixin = (obj) => {
    obj.sayAge = function() {
        console.log(`I am ${this.age} years old`);
    };
};

const person = {
    name: 'John',
    age: 25
};

sayHelloMixin(person);
sayAgeMixin(person);

person.sayHello(); // Hello, my name is John
person.sayAge();   // I am 25 years old


4. Object.create() μ‚¬μš©: νŠΉμ • 객체λ₯Ό ν”„λ‘œν† νƒ€μž…μœΌλ‘œ κ°–λŠ” μƒˆλ‘œμš΄ 객체λ₯Ό 생성할 λ•Œ Object.create()λ₯Ό μ‚¬μš©ν•˜λ©΄ 보닀 λͺ…ν™•ν•œ ν”„λ‘œν† νƒ€μž… 체인을 ꡬ성할 수 μžˆμŠ΅λ‹ˆλ‹€.

const parent = {
    sayHello() {
        console.log('Hello');
    }
};

const child = Object.create(parent);
child.sayHello(); // Hello
728x90
λ°˜μ‘ν˜•