자바스크립트에서 함수의 프로토타입 체인을 활용한 상속 구현 방법은 무엇인가요?
_____A1: 자바스크립트에서 모든 함수는 기본적으로 `prototype`이라는 속성을 가지고 있으며, 생성자 함수로 사용될 때 이 prototype 객체가 생성될 객체의 프로토타입이 됩니다. 프로토타입 체인은 객체 간 상속 관계를 형성하여, 자식 객체가 부모 객체의 속성과 메서드를 참조할 수 있게 해줍니다.
---
Q2: 함수의 프로토타입을 활용한 상속은 왜 사용하나요?
A2: 프로토타입을 통해 상속하면 메서드가 부모 객체의 prototype에 한번만 정의되고, 여러 자식 인스턴스가 이를 공유할 수 있습니다. 따라서 메모리 효율이 좋고, 자바스크립트 고유의 동적 상속 구조를 자연스럽게 활용할 수 있습니다.
---
Q3: 기본적인 프로토타입 체인 상속 구현 방법은 어떻게 되나요?
A3:
1. 부모 생성자 함수를 정의한다.
2. 자식 생성자 함수 내부에서 부모 생성자 함수를 호출해 부모의 초기화를 수행한다.
3. 자식 함수의 `prototype`을 부모 함수의 `prototype`을 참조하는 새로운 객체로 교체한다.
4. 자식 함수의 `prototype.constructor`를 자식 생성자로 재설정한다.
예시:
```javascript
function Parent(name) {
this.name = name;
}
Parent.prototype.sayHello = function() {
console.log("Hello, " + this.name);
};
function Child(name, age) {
Parent.call(this, name); // 부모 생성자 호출
this.age = age;
}
Child.prototype = Object.create(Parent.prototype); // 프로토타입 체인 연결
Child.prototype.constructor = Child; // constructor 참조 복원
console.log(this.name + " is " + this.age + " years old");
};
const child = new Child("Alice", 10);
child.sayHello(); // "Hello, Alice"
child.sayAge(); // "Alice is 10 years old"
```
---
Q4: `Object.create` 대신에 단순히 `Child.prototype = Parent.prototype;`를 해도 되나요?
A4: 권장하지 않습니다. 이렇게 하면 자식과 부모가 같은 `prototype` 객체를 공유하게 되어, 자식에서 프로토타입에 메서드를 추가하거나 변경하면 부모도 영향을 받는 문제가 발생합니다. `Object.create`를 사용하면 부모 프로토타입을 상속한 독립적인 객체를 생성하여 문제를 방지합니다.
---
Q5: 왜 `Child.prototype.constructor`를 다시 자식 함수로 지정해야 하나요?
A5: `Child.prototype = Object.create(Parent.prototype);` 로 교체하면 `constructor` 속성이 부모 생성자로 설정되므로, 원래의 자식 생성자 정보가 사라집니다. 이를 복원하기 위해 명시적으로 `Child.prototype.constructor = Child;`를 설정합니다.
---
Q6: 프로토타입 상속과 클래스(class) 문법 상속과의 차이점은 무엇인가요?
A6: 클래스 문법은 프로토타입 기반 상속을 더 간결하고 명확하게 표기한 문법적 설탕(syntactic sugar)입니다. 실제로 클래스 내부에서 상속할 때도 프로토타입 체인이 내부적으로 활용됩니다. 과거에는 프로토타입을 직접 다뤘지만, ES6 이후로는 클래스 문법을 주로 사용합니다.
---
Q7: 요약하면 자바스크립트에서 함수 프로토타입 체인 활용 상속 구현 절차는?
A7:
- 부모 생성자 정의 및 프로토타입 메서드 추가
- 자식 생성자에서 부모 생성자 호출 (`call`, `apply`)으로 속성 초기화
- 자식 프로토타입을 `Object.create`로 부모 프로토타입 객체를 상속받도록 설정
- 자식 프로토타입의 `constructor`를 자식 생성자로 재설정
- 필요한 자식 프로토타입 메서드 추가
이 절차를 통해 자식 인스턴스가 부모의 속성과 메서드를 사용할 수 있는 프로토타입 체인이 완성됩니다.
자바스크립트는 프로토타입 기반의 언어이기 때문에, 객체는 다른 객체로부터 속성과 메서드를 상속받을 수 있습니다.
이를 통해 코드의 재사용성과 구조적인 설계를 할 수 있습니다.
아래에서는 프로토타입 체인을 활용한 상속 구현 방법에 대해 자세히 설명하겠습니다.
1. 기본 개념 자바스크립트에서 모든 객체는 다른 객체를 프로토타입으로 가질 수 있습니다.
객체가 특정 속성이나 메서드를 찾을 때, 자바스크립트는 해당 객체의 프로토타입을 확인하고, 그 프로토타입의 프로토타입을 확인하는 식으로 체인을 따라가며 탐색합니다.
이를 프로토타입 체인이라고 합니다.
2. 생성자 함수와 프로토타입 자바스크립트에서 객체를 생성하기 위해 생성자 함수를 사용합니다.
생성자 함수는 일반 함수와 비슷하지만, 대문자로 시작하는 이름을 가지며 `new` 키워드를 사용하여 호출됩니다.
생성자 함수 내에서 `this` 키워드를 사용하여 인스턴스의 속성을 정의할 수 있습니다.
```javascript function Animal(name) { this.name = name; } Animal.prototype.speak = function() { console.log(this.name + ' makes a noise.'); }; ``` 위의 예제에서 `Animal`은 생성자 함수이며, `speak` 메서드는 `Animal`의 프로토타입에 정의되어 있습니다.
이제 `Animal`의 인스턴스를 생성할 수 있습니다.
```javascript const dog = new Animal('Dog'); dog.speak(); // "Dog makes a noise." ```
3. 상속 구현하기 상속을 구현하기 위해서는 자식 생성자 함수가 부모 생성자 함수의 프로토타입을 상속받도록 설정해야 합니다.
이를 위해 `Object.create()` 메서드를 사용할 수 있습니다.
```javascript function Dog(name) { Animal.call(this, name); // 부모 생성자 호출 } // Dog의 프로토타입을 Animal의 인스턴스로 설정 Dog.prototype = Object.create(Animal.prototype); Dog.prototype.constructor = Dog; // constructor 속성 재설정 Dog.prototype.speak = function() { console.log(this.name + ' barks.'); }; const dog = new Dog('Rex'); dog.speak(); // "Rex barks." ``` 위의 코드에서 `Dog` 생성자 함수는 `Animal` 생성자 함수를 호출하여 `name` 속성을 초기화합니다.
그리고 `Dog.prototype`을 `Animal.prototype`의 인스턴스로 설정하여 `Dog`가 `Animal`의 메서드를 상속받도록 합니다.
마지막으로 `Dog.prototype.constructor`를 `Dog`로 재설정하여 `Dog` 인스턴스의 `constructor` 속성이 올바르게 설정되도록 합니다.
4. 프로토타입 체인의 장점 1. 코드 재사용 : 프로토타입 체인을 통해 여러 객체가 동일한 메서드를 공유할 수 있으므로 메모리 사용을 줄일 수 있습니다.
2. 유지보수 용이 : 공통 메서드를 프로토타입에 정의하면, 해당 메서드를 수정할 때 모든 인스턴스에 자동으로 반영됩니다.
3. 유연한 구조 : 프로토타입 체인을 사용하면 동적으로 메서드를 추가하거나 수정할 수 있어 유연한 객체 구조를 만들 수 있습니다.
5. 주의사항 - 프로토타입 수정 : 프로토타입을 수정하면 해당 프로토타입을 상속받는 모든 객체에 영향을 미치므로 주의해야 합니다.
- `instanceof` 연산자 : 상속 관계를 확인할 때 `instanceof` 연산자를 사용할 수 있습니다.
예를 들어, `dog instanceof Dog`는 `true`를 반환하고, `dog instanceof Animal`도 `true`를 반환합니다.
결론 자바스크립트에서 함수의 프로토타입 체인을 활용한 상속은 객체 지향 프로그래밍을 구현하는 강력한 방법입니다.
이를 통해 코드의 재사용성을 높이고, 유지보수를 용이하게 하며, 유연한 객체 구조를 만들 수 있습니다.
프로토타입 체인을 이해하고 활용하는 것은 자바스크립트 개발자에게 필수적인 기술입니다.
작성자:
박재훈 [비회원]
| 작성일자: 1년 전
2024-09-10 08:37:07
조회수: 137 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 137 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.