[JS ES6] 객체지향2. prototype

gminnimk·2025년 3월 20일

JS ES6

목록 보기
13/31

객체지향2. Prototype

JavaScript에서 상속은 constructor를 통해 이루어질 수도 있지만, prototype이라는 또 다른 메커니즘을 사용해 상속 기능을 구현할 수 있습니다. prototype은 일종의 “부모의 유전자” 역할을 하여, 자식 객체들이 공통된 속성과 메서드를 공유할 수 있도록 도와줍니다.


1️⃣ Prototype 기본 개념

  • 자동 생성:
    • 함수를 생성하면 해당 함수에는 자동으로 prototype이라는 숨겨진 프로퍼티가 생성됩니다.
    • prototype은 해당 constructor로 생성된 모든 인스턴스(자식 객체)들이 공유하는 공간입니다.
  • 상속의 역할:
    • 만약 자식 객체에 원하는 프로퍼티가 없으면, JavaScript 엔진은 부모인 prototype에 해당 프로퍼티가 있는지 차례대로 찾아봅니다.
    • 즉, 내가 직접 가지고 있지 않으면 부모(또는 부모의 부모…)에게 물어본다는 원리로 작동합니다.

2️⃣ Prototype을 이용한 상속 예제

예제 1: 기본 속성 상속

function 기계() {
  this.name = 'Kim';
  this.age = 15;
}
var 학생1 = new 기계();
var 학생2 = new 기계();

console.log(기계.prototype);
// 출력 결과: prototype 객체(빈 객체 또는 기본 프로퍼티들이 포함된 객체)
  • 설명:
    • 기계 함수를 통해 생성된 모든 객체는 내부적으로 기계.prototype이라는 공간을 가지게 됩니다.

예제 2: Prototype에 속성 추가

function 기계() {
  this.name = 'Kim';
  this.age = 15;
}

기계.prototype.gender = '남';

var 학생1 = new 기계();
var 학생2 = new 기계();

console.log(학생1.gender); // 출력: '남'
  • 설명:
    • 기계.prototypegender라는 프로퍼티를 추가하면, 이후 생성된 모든 인스턴스(자식 객체)에서 해당 값을 사용할 수 있습니다.
    • 학생1, 학생2 모두 자신이 직접 gender를 갖고 있지 않더라도, 상위 프로토타입에 있는 gender를 참조합니다.

3️⃣ Prototype의 작동 원리 (프로토타입 체인)

JavaScript는 객체의 프로퍼티를 찾을 때 다음과 같은 순서로 검사합니다:

  1. 자신의 속성:
    • 먼저 객체 자신이 해당 프로퍼티를 가지고 있는지 확인합니다.
  2. 부모의 프로토타입:
    • 없다면, 객체의 프로토타입(부모)에 해당 프로퍼티가 있는지 확인합니다.
  3. 프로토타입 체인:
    • 부모에 없다면, 부모의 프로토타입(조부모)에서 다시 찾는 과정을 반복합니다.

이 과정을 통해 자식 객체는 prototype에 저장된 속성과 메서드를 자유롭게 사용할 수 있습니다.


4️⃣ 내장 함수와 Prototype

  • 내장 메서드 활용:
    • 예를 들어, 배열(Array)이나 객체(Object)에는 toString(), sort(), push(), map(), forEach() 등 다양한 내장 메서드가 존재합니다.
    • 이러한 메서드들은 배열이나 객체 자체가 아니라, 이들의 부모인 Array.prototype 또는 Object.prototype에 정의되어 있습니다.

예제: Array의 prototype 확인

var arr = [1, 2, 3];
console.log(arr.toString()); // 내장 메서드 사용 가능

console.log(Array.prototype);
// Array의 prototype에는 sort, map, push 등 여러 함수가 정의되어 있습니다.
  • 설명:
    • 사람이 간편하게 []를 사용하여 배열을 만들더라도, 내부적으로는 new Array()로 생성되어 Array의 prototype을 상속받습니다.
    • 이 때문에 모든 배열 인스턴스는 Array.prototype에 정의된 메서드들을 사용할 수 있습니다.

5️⃣ Constructor 상속 vs. Prototype 상속

  • Constructor 상속:
    • 생성자 함수 내에서 직접 프로퍼티를 정의하여, 각 인스턴스가 해당 값을 직접 소유하게 만듭니다.
  • Prototype 상속:
    • 공통된 속성이나 메서드는 prototype에 정의하여, 인스턴스들이 해당 속성을 공유(참조)하게 만듭니다.
    • 주로 상속할 함수나 공통 속성은 prototype에 추가하여 메모리 사용 효율성을 높입니다.

📌 정리

  • prototype의 역할:
    • prototype은 자식 객체들이 공유하는 “유전자”와 같은 공간으로, 상속 기능을 단순하고 효율적으로 구현할 수 있게 해줍니다.
  • 프로토타입 체인:
    • 객체에서 프로퍼티를 찾을 때 자신부터 시작하여 차례대로 부모의 prototype까지 검사하는 메커니즘 덕분에, 상속된 속성과 메서드를 사용할 수 있습니다.
  • 내장 메서드 사용:
    • Array나 Object 등 기본 내장 객체들이 prototype을 통해 다양한 메서드를 상속받아 사용 가능한 원리를 이해하는 것이 중요합니다.
  • 상속 전략 선택:
    • 자식 객체가 프로퍼티를 직접 소유하게 하려면 constructor 내에서 정의하고, 공유할 필요가 있는 공통 기능은 prototype에 정의하는 방식으로 상속을 구현합니다.

0개의 댓글