프로토타입 체인

AI
qwen-3-235b-a22b-instruct-2507
작성자
익명
작성일
2025.09.02
조회수
6
버전
v1

프로토타입 체인

개요

프로토타입 체(Prototype Chain)은 자바스크립트(JavaScript)에서 객체 간 상속을 구현하는 핵심 메커니즘입니다. 자바스크립트는 전통적인 클래스 기반 객체지향 언어(C++, Java 등)와 달리 프로토타입 기반(prototype-based) 언어로, 객체가 직접 다른 객체를 자신의 원형(prototype)으로 참조함으로써 속성과 메서드를 상속받는 방식을 사용합니다. 이 구조를 통해 코드 재사용성과 객체 간 계층적 관계를 효과적으로 구현할 수 있습니다.

프로토타입 체인은 자바스크립트의 동작 원리 중 하나로, 객체의 속성이나 메서드를 찾을 때 해당 객체 자체에 존재하지 않으면, 자동으로 그 객체의 프로토타입을 따라 올라가며 탐색을 수행합니다. 이 과정은 최상위 프로토타입인 [Object.prototype](/doc/%EA%B8%B0%EC%88%A0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/JavaScript/Object.prototype)에 도달할 때까지 지속되며, 이를 프로토타입 체인 탐색(prototype chain lookup)이라고 합니다.


프로토타입의 개념

프로토타입이란?

모든 자바스크립트 함수는 생성될 때 자동으로 prototype이라는 특수한 속성을 가지며, 이 속성은 객체를 가리킵니다. 이 객체는 해당 함수로 생성된 인스턴스들이 공유할 수 있는 속성과 메서드를 정의하는 공간입니다.

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

Person.prototype.greet = function() {
  console.log(`Hello, I'm ${this.name}`);
};

const john = new Person('John');
john.greet(); // "Hello, I'm John"

위 예제에서 john 객체는 greet 메서드를 직접 정의하지 않았지만, Person.prototype에 정의된 메서드를 프로토타입 체인을 통해 접근할 수 있습니다.


프로토타입 체인의 작동 방식

1. 속성 탐색 과정

객체의 속성에 접근할 때, 자바스크립트 엔진은 다음과 같은 순서로 탐색을 수행합니다:

  1. 객체 자체에 속성이 존재하는지 확인
  2. 존재하지 않으면, 객체의 [[Prototype]] (내부 슬롯)을 참조하여 프로토타입 객체로 이동
  3. 프로토타입 객체에서 속성 탐색 반복
  4. 최종적으로 Object.prototype에 도달하거나, 속성을 찾을 때까지 계속

const obj = {};
console.log(obj.toString()); // Object.prototype에 정의된 메서드

objtoString을 직접 정의하지 않았지만, Object.prototype에 정의되어 있어 호출 가능합니다.

2. [__proto__](/doc/%EA%B8%B0%EC%88%A0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/JavaScript/__proto__)[Object.getPrototypeOf](/doc/%EA%B8%B0%EC%88%A0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/JavaScript/Object.getPrototypeOf)()

객체의 프로토타입은 __proto__ 속성(비권장) 또는 표준 메서드 Object.getPrototypeOf()로 접근할 수 있습니다.

const person = new Person('Jane');
console.log(Object.getPrototypeOf(person) === Person.prototype); // true

⚠️ 주의: __proto__는 비권장 속성이므로, 가능하면 Object.getPrototypeOf()[Object.setPrototypeOf](/doc/%EA%B8%B0%EC%88%A0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/JavaScript/Object.setPrototypeOf)()를 사용하는 것이 좋습니다.


프로토타입 체인의 계층 구조

자바스크립트의 표준 객체 계층은 다음과 같은 구조를 가집니다:

자신의 인스턴스
    ↓
생성자.prototype
    ↓
Object.prototype
    ↓
null

예를 들어:

function Animal() {}
function Dog() {}

Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;

const dog = new Dog();
console.log(Object.getPrototypeOf(dog) === Dog.prototype); // true
console.log(Object.getPrototypeOf(Dog.prototype) === Animal.prototype); // true
console.log(Object.getPrototypeOf(Animal.prototype) === Object.prototype); // true
console.log(Object.getPrototypeOf(Object.prototype)); // null

이 구조는 다중 상속과 유사한 계층을 형성하며, 자식 객체가 부모 객체의 기능을 상속받도록 합니다.


ES6 클래스와 프로토타입 체인

ES6에서는 class 키워드를 도입하여 문법적으로 클래스 기반 언어처럼 보이게 했지만, 내부적으로는 여전히 프로토타입 체인을 기반으로 동작합니다.

class Animal {
  speak()    console.log('Animal speaks');
  }
}

class Dog extends Animal {
  bark() {
    console.log('Woof!');
  }
}

const dog = new Dog();
dog.speak(); // Animal.prototype에서 상속
dog.bark();  // Dog.prototype에 정의

여기서 Dog.prototypeAnimal.prototype을 상속받으며, 프로토타입 체인이 형성됩니다.


주의사항과 성능 고려

  • 프로토타입 체인이 길어질수록 속성 탐색에 시간이 더 걸릴 수 있습니다.
  • 프로토타입에 정의된 속성은 모든 인스턴스가 공유하므로, 상태(state)를 가지는 데이터는 인스턴스 자체에 정의해야 합니다.
  • for...in 루프는 프로토타입 체인에 있는 모든 열거 가능한 속성을 포함하므로, [hasOwnProperty](/doc/%EA%B8%B0%EC%88%A0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/JavaScript/hasOwnProperty)()를 사용해 필터링하는 것이 좋습니다.

for (let key in dog) {
  if (dog.hasOwnProperty(key)) {
    console.log(key); // 인스턴스 고유 속성만 출력
  }
}


관련 문서 및 참고 자료

프로토타입 체인은 자바스크립트의 핵심 개념 중 하나로, 객체지향 프로그래밍을 깊이 이해하기 위해 반드시 숙지해야 할 내용입니다. 이를 통해 효율적이고 유연한 코드 구조를 설계할 수 있습니다.

AI 생성 콘텐츠 안내

이 문서는 AI 모델(qwen-3-235b-a22b-instruct-2507)에 의해 생성된 콘텐츠입니다.

주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.

이 AI 생성 콘텐츠가 도움이 되었나요?