자바스크립트 프로토타입(Prototype)

자바스크립트는 프로토타입 기반 언어로 알려져 있습니다. 프로토타입은 객체 지향 프로그래밍에서 중요한 개념으로, 자바스크립트에서도 객체를 생성하고 상속하는 데 사용됩니다.

프로토타입이란?

프로토타입은 다른 객체로부터 상속을 받는 것을 말합니다. 모든 객체는 프로토타입(prototype)이라는 숨은 속성을 가지고 있으며, 해당 프로토타입은 다른 객체와 연결됩니다. 이렇게 객체 간의 상속 관계를 통해 속성과 메서드를 공유할 수 있습니다.

프로토타입 체인

프로토타입 체인(prototype chain)은 프로토타입이 연결된 객체들의 계층 구조를 말합니다. 객체에서 속성 또는 메서드를 찾을 때, 해당 객체의 프로토타입 체인을 따라 올라가며 찾습니다.

// 예제 객체 생성 
let person = {
  name: "John",
  sayHello: function() {
    console.log(`Hello, my name is ${this.name}.`);
  }
};

// person2는 person을 프로토타입으로 가지는 새로운 객체
let person2 = Object.create(person);
person2.age = 30;

console.log(person2.name); // John
person2.sayHello(); // Hello, my name is John.

위 코드에서 person2 객체는 person 객체를 프로토타입으로 가집니다. 따라서 person2 객체에서 name 속성과 sayHello 메서드를 사용할 수 있습니다.

프로토타입 상속

자바스크립트에서 프로토타입을 사용하여 상속을 구현할 수 있습니다. Object.create() 메서드를 사용하여 새로운 객체를 생성하고, 이를 다른 객체의 프로토타입으로 설정할 수 있습니다.

// 부모 객체 생성
let Animal = {
  sleep: function() {
    console.log("Zzz...");
  }
};

// 자식 객체 생성
let Cat = Object.create(Animal);
Cat.meow = function() {
  console.log("Meow!");
};

let kitty = Object.create(Cat);
kitty.meow(); // Meow!
kitty.sleep(); // Zzz...

위 코드에서 Animal 객체는 sleep 메서드를 갖고 있으며, Cat 객체는 이를 프로토타입으로 상속받습니다. 따라서 kitty 객체에서 meow 메서드와 sleep 메서드를 모두 사용할 수 있습니다.

프로토타입의 확장

자바스크립트에서 프로토타입은 동적으로 확장이 가능합니다. 이미 생성된 객체들에 대한 변경사항은 해당 객체들과 그들의 프로토타입 체인 전체에 영향을 줍니다.

// 예제 객체 생성
let car = {
  speed: 0,
  accelerate: function() {
    this.speed += 10;
  }
};

let myCar = Object.create(car);
myCar.accelerate();

console.log(myCar.speed); // 10

car.decelerate = function() {
  this.speed -= 5;
};

myCar.decelerate();
console.log(myCar.speed); // 5

위 코드에서 car 객체는 accelerate 메서드를 가지고 있으며, myCar 객체는 이를 프로토타입으로 상속받습니다. 이후 car 객체에 decelerate 메서드를 추가하면, myCar 객체에서도 해당 메서드를 사용할 수 있습니다.

결론

자바스크립트의 프로토타입은 객체 지향 프로그래밍에서 상속과 재사용성을 구현하는 강력한 기능입니다. 프로토타입 체인을 통해 객체 간의 관계를 구성하고 속성과 메서드를 공유할 수 있습니다. 프로토타입을 활용하여 프로그램을 모듈화하고 확장성을 높일 수 있습니다.