2026년 상식닷컴 선정 식당 & 카페 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요

자바스크립트에서 함수의 프로토타입을 활용한 상속 구현 방법은 무엇인가요?

_____
Q1: 자바스크립트에서 함수의 프로토타입을 활용한 상속이란 무엇인가요?
A1: 자바스크립트는 프로토타입 기반 언어로서, 모든 객체는 자신의 프로토타입 객체를 참조합니다. 함수(생성자 함수)의 `prototype` 속성을 활용하여, 다른 객체 또는 생성자 함수의 프로토타입을 상속받아 새로운 객체를 생성하는 방식이 프로토타입 기반 상속입니다. 이를 통해 메서드나 속성을 재사용할 수 있습니다.

---

Q2: 프로토타입 상속은 어떻게 구현하나요? 기본적인 방법을 알려주세요.
A2: 생성자 함수 A를 상속받는 생성자 함수 B가 있다고 가정할 때, B의 프로토타입을 A의 인스턴스 혹은 `Object.create(A.prototype)`로 설정하면 됩니다. 예시는 다음과 같습니다.

```javascript
function A(name) {
this.name = name;
}

A.prototype.sayName = function() {
console.log("My name is " + this.name);
};

function B(name, age) {
A.call(this, name); // A 생성자 호출: 상위 속성 초기화
this.age = age;
}

// B의 프로토타입을 A의 인스턴스 혹은 Object.create로 설정
B.prototype = Object.create(A.prototype);

// B.prototype의 constructor 재설정 (필수)
B.prototype.constructor = B;

B.prototype.sayAge = function() {
console.log("I am " + this.age + " years old");
};

const b = new B("Alice", 30);
b.sayName(); // My name is Alice
b.sayAge(); // I am 30 years old
```
---

Q3: 왜 `B.prototype = Object.create(A.prototype)`를 사용하나요?
A3: `B.prototype = new A()`로 설정할 수도 있지만, 이렇게 하면 A 생성자 함수가 실행되어 예기치 않은 부작용(속성 초기화)이 발생할 수 있습니다. `Object.create(A.prototype)`는 A의 프로토타입 객체를 기반으로 새로운 객체를 생성하며, A 생성자를 호출하지 않으므로 부작용이 없습니다.

---

Q4: `B.prototype.constructor = B`를 반드시 해야 하는 이유는 무엇인가요?
A4: `B.prototype = Object.create(A.prototype)` 할당 후 `B.prototype.constructor`는 기본적으로 A가 됩니다. 이는 생성자 정보가 올바르게 유지되지 않아 디버깅, 인스턴스 생성자 비교 등에 문제를 일으킬 수 있으므로, 반드시 다시 `B`로 설정해주는 것이 좋습니다.

---

Q5: `call`이나 `apply` 메서드는 상속 구현에 왜 사용되나요?
A5: 생성자 함수 내부에서 상위 생성자(A)를 호출(`A.call(this, ...)`)하여 상위 생성자의 인스턴스 속성이 하위 인스턴스에 복사되도록 합니다. 이 방법으로 각 인스턴스는 고유한 속성을 가질 수 있고, 상위 생성자의 초기화 로직도 재사용할 수 있습니다.

---

Q6: 프로토타입 체인 상속 방법과 차이점은 무엇인가요?
A6: 프로토타입 체인 상속은 `B.prototype = new A()`와 같이 상위 생성자의 인스턴스를 프로토타입으로 설정하는 방식이고, 프로퍼티 초기화가 불필요하게 발생하는 단점이 있습니다. 반면, `Object.create(A.prototype)`는 불필요한 생성자 호출 없이 객체 연결만 수행하므로 안전하고 권장됩니다.

---

Q7: ES6 클래스 문법과 비교했을 때, 프로토타입 기반 상속은 어떤 장단점이 있나요?
A7:
- 장점: ES5 이하 환경에서 호환성 높음, 자바스크립트 동작 원리 직접 이해 가능
- 단점: 문법이 다소 장황하고 실수하기 쉬우며, `class` 문법이 훨씬 간결하고 명료함
따라서 최신 자바스크립트에서는 `class`와 `extends` 키워드를 사용하는 것이 일반적입니다.

---

요약 :
- 생성자 함수에서 상위 생성자를 `call`하여 속성 초기화
- 하위 생성자 프로토타입을 `Object.create`로 상위 생성자 프로토타입 연결
- `constructor` 속성 재설정
- 메서드는 상위 프로토타입에 정의해 재사용

이 방법을 통해 자바스크립트 함수 프로토타입을 활용한 상속이 구현됩니다.
자바스크립트에서 함수의 프로토타입을 활용한 상속 구현 방법은 객체 지향 프로그래밍의 중요한 개념 중 하나입니다.

자바스크립트는 프로토타입 기반 언어이기 때문에, 클래스 기반 언어에서의 상속과는 다르게 프로토타입을 통해 객체 간의 관계를 설정합니다.

아래에서는 자바스크립트에서 프로토타입을 활용한 상속 구현 방법에 대해 자세히 설명하겠습니다.

1. 기본 개념 자바스크립트에서 모든 객체는 다른 객체를 참조할 수 있는 `[[Prototype]]`이라는 내부 속성을 가지고 있습니다.

이 속성을 통해 객체는 다른 객체의 속성과 메서드에 접근할 수 있습니다.

프로토타입 상속은 이러한 `[[Prototype]]` 체인을 활용하여 구현됩니다.



2. 프로토타입 상속 구현하기

2.1. 생성자 함수 정의 먼저, 상속할 기본 객체(부모)를 정의하기 위해 생성자 함수를 만듭니다.

예를 들어, `Animal`이라는 생성자 함수를 정의해 보겠습니다.

```javascript function Animal(name) { this.name = name; } Animal.prototype.speak = function() { console.log(this.name + ' makes a noise.'); }; ``` 위 코드에서 `Animal` 생성자 함수는 `name`이라는 속성을 초기화하며, `speak`라는 메서드를 프로토타입에 추가합니다.



2.2. 자식 객체 생성 이제 `Animal`을 상속받는 `Dog`라는 생성자 함수를 정의합니다.

이를 위해 `Animal`의 프로토타입을 `Dog`의 프로토타입으로 설정합니다.

```javascript function Dog(name) { Animal.call(this, name); // 부모 생성자 호출 } // Dog의 프로토타입을 Animal의 인스턴스로 설정 Dog.prototype = Object.create(Animal.prototype); Dog.prototype.constructor = Dog; // 생성자 속성 복원 Dog.prototype.speak = function() { console.log(this.name + ' barks.'); }; ``` 위 코드에서 `Dog` 생성자 함수는 `Animal`의 생성자를 호출하여 `name` 속성을 초기화합니다.

그리고 `Dog.prototype`을 `Animal.prototype`의 인스턴스로 설정하여 상속 관계를 형성합니다.

마지막으로 `constructor` 속성을 복원하여 `Dog` 생성자와의 연결을 유지합니다.



2.3. 인스턴스 생성 및 메서드 호출 이제 `Dog` 객체를 생성하고 메서드를 호출해 보겠습니다.

```javascript const dog = new Dog('Rex'); dog.speak(); // "Rex barks." ``` 위 코드에서 `Dog`의 인스턴스를 생성하고 `speak` 메서드를 호출하면, `Dog`의 `speak` 메서드가 실행됩니다.



3. 프로토타입 상속의 장점 - 코드 재사용 : 부모 객체의 메서드를 자식 객체에서 재사용할 수 있어 코드 중복을 줄일 수 있습니다.

- 메모리 효율성 : 메서드가 프로토타입에 정의되므로, 모든 인스턴스가 메서드를 공유하게 되어 메모리 사용량이 줄어듭니다.

- 유연성 : 상속 구조를 통해 객체 간의 관계를 유연하게 설정할 수 있습니다.



4. 프로토타입 상속의 단점 - 복잡성 : 프로토타입 체인이 깊어질 경우, 코드의 가독성이 떨어질 수 있습니다.

- `this`의 문제 : 메서드가 호출될 때 `this`의 컨텍스트가 변경될 수 있어 주의가 필요합니다.



5. ES6 클래스 문법 ES6에서는 클래스를 도입하여 상속을 더 직관적으로 구현할 수 있습니다.

하지만, 내부적으로는 여전히 프로토타입 기반의 상속을 사용합니다.

```javascript class Animal { constructor(name) { this.name = name; } speak() { console.log(this.name + ' makes a noise.'); } } class Dog extends Animal { speak() { console.log(this.name + ' barks.'); } } const dog = new Dog('Rex'); dog.speak(); // "Rex barks." ``` 위와 같이 ES6의 `class` 문법을 사용하면 상속을 더 간결하게 표현할 수 있습니다.

결론 자바스크립트에서 함수의 프로토타입을 활용한 상속 구현 방법은 객체 지향 프로그래밍의 중요한 기법입니다.

프로토타입을 통해 객체 간의 관계를 설정하고, 코드 재사용성을 높이며, 메모리 효율성을 개선할 수 있습니다.

ES6의 클래스 문법을 통해 이러한 상속 구조를 더 직관적으로 구현할 수 있지만, 프로토타입 기반의 상속 개념은 여전히 자바스크립트의 핵심입니다.

작성자: 정유진 [비회원] | 작성일자: 1년 전 2024-09-10 08:37:05
조회수: 137 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.