자바스크립트는 프로토타입 기반 언어로 알려져 있습니다. 프로토타입은 객체 지향 프로그래밍에서 중요한 개념으로, 자바스크립트에서도 객체를 생성하고 상속하는 데 사용됩니다.
프로토타입이란?
프로토타입은 다른 객체로부터 상속을 받는 것을 말합니다. 모든 객체는 프로토타입(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
객체에서도 해당 메서드를 사용할 수 있습니다.
결론
자바스크립트의 프로토타입은 객체 지향 프로그래밍에서 상속과 재사용성을 구현하는 강력한 기능입니다. 프로토타입 체인을 통해 객체 간의 관계를 구성하고 속성과 메서드를 공유할 수 있습니다. 프로토타입을 활용하여 프로그램을 모듈화하고 확장성을 높일 수 있습니다.