[javascript] 프로토타입 체인과 상속의 개념

JavaScript는 프로토타입 기반의 객체 지향 언어입니다. 이는 클래스 기반의 언어와는 다른 방식으로 객체를 생성하고 상속을 구현합니다.

프로토타입 체인

프로토타입 체인은 JavaScript의 객체 간 상속을 구현하는 메커니즘입니다. 모든 객체는 자신의 프로토타입을 가리키는 __proto__라는 내부 프로퍼티를 가지고 있습니다.

객체의 프로토타입은 다른 객체로서 동작할 수 있습니다. 즉, 어떤 객체의 프로퍼티나 메서드에 접근하려고 할 때, 해당 객체에 해당 프로퍼티나 메서드가 없으면 프로토타입 체인을 따라가며 상위 객체에서 해당 프로퍼티나 메서드를 찾습니다. 이 과정은 객체의 프로토타입을 참조하는 __proto__를 계속 따라가며 진행됩니다.

아래는 프로토타입 체인을 나타내는 예시입니다.

let person = {
  name: "Jane",
  age: 25,
};

let student = {
  major: "Computer Science",
};

student.__proto__ = person;

console.log(student.name); // "Jane"
console.log(student.age); // 25

위 예시에서 student 객체는 person 객체를 프로토타입으로 가지고 있습니다. 따라서 student 객체에서 nameage 프로퍼티를 찾지 못하면 프로토타입 체인을 따라 person 객체에서 해당 프로퍼티를 찾아 출력합니다.

상속

JavaScript에서는 프로토타입 체인을 이용하여 상속을 구현할 수 있습니다. 객체의 프로토타입으로 기능을 정의한 후, 새로운 객체를 생성할 때 해당 프로토타입을 상속받도록 설정할 수 있습니다.

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

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

function Student(name, age, major) {
  Person.call(this, name, age);
  this.major = major;
}

Student.prototype = Object.create(Person.prototype);
Student.prototype.constructor = Student;

let jane = new Student("Jane", 25, "Computer Science");
jane.greet(); // "Hello, my name is Jane"

위 예시에서 Person 함수는 nameage 프로퍼티를 가지는 객체를 생성하는 생성자 함수입니다. 해당 생성자 함수의 프로토타입에 greet 메서드를 추가하고, Student 함수는 Person 생성자 함수를 호출하여 nameage 프로퍼티를 초기화합니다. 그리고 Student 함수의 프로토타입을 Person 생성자 함수의 프로토타입을 상속하도록 설정합니다.

이를 통해 jane 객체는 Person 객체의 프로퍼티와 메서드를 상속받아 사용할 수 있습니다.

결론

JavaScript의 프로토타입 체인과 상속은 객체 지향 프로그래밍에서 클래스 기반의 상속과는 다른 접근 방식을 제공합니다. 프로토타입 체인을 통해 객체 간의 상속을 구현하고, 상속을 통해 코드의 재사용성을 높일 수 있습니다.