
PROTO로 배우는 객체 상속
객체 상속은 상속을 통해 코드의 재사용성과 구조적 유연성을 높이는 중요한 개념입니다. JavaScript에서는 프로토타입을 사용하여 객체 간의 상속을 구현하게 됩니다. 이번 섹션에서는 객체의 생성과 프로토타입, 그리고 프로토타입 체인에 대해 알아보도록 하겠습니다.
객체의 생성과 프로토타입
JavaScript에서 객체는 여러 방법으로 생성될 수 있으며, 그에 따라 프로토타입이 결정됩니다. 객체 리터럴을 사용하여 생성된 객체는 기본적으로 Object.prototype을 프로토타입으로 가지게 되며, 생성자 함수를 통해 생성된 객체는 생성자 함수의 prototype 프로퍼티와 연결됩니다.
“모든 개체는 하나의 프로토타입을 갖는다.”
예를 들어, 다음과 같은 코드로 객체를 생성할 수 있습니다:
const person = { name: 'cha' }; // 객체 리터럴로 생성된 경우
이처럼 생성된 객체의 프로토타입은 기본적으로 Object.prototype이 됩니다. 모든 객체는 자신의 프로토타입에 접근하기 위해 __proto__ 접근자 프로퍼티를 사용할 수 있습니다.
| 구분 | 객체 리터럴 | 생성자 함수 |
|---|---|---|
| 프로토타입 | Object.prototype |
생성자 함수의 prototype 프로퍼티 |
| 생성 방법 | {} 를 통해 생성 |
new Constructor()를 통해 생성 |
| 예 | const obj = {} |
const obj = new Person() |
이렇게 객체를 통해 상속을 구현함으로써, 하위 객체는 상위 객체의 프로퍼티와 메서드를 사용할 수 있습니다.
프로토타입 체인 이해하기
프로토타입 체인은 객체의 프로퍼티나 메서드에 접근할 때 중요한 역할을 합니다. 자바스크립트 엔진은 대상 객체에서 해당 프로퍼티를 찾지 못할 경우, __proto__ 접근자를 통해 프로토타입을 검색합니다. 이 과정은 최상위 객체인 Object.prototype에 도달할 때까지 계속됩니다.
자바스크립트에서의 프로토타입 체인은 단방향 링크드 리스트 형태로 구현되어 있으며, 순환참조를 방지하기 위해 제한된 방식으로 작동합니다. 만약 프로토타입 교체가 임의로 이루어진다면, 무한 루프가 발생할 수 있습니다. 따라서 다음과 같은 방식으로 프로토타입을 설정하는 것이 권장됩니다:
Object.getPrototypeOf(obj): 프로토타입을 가져올 때 사용Object.setPrototypeOf(obj, prototype): 프로토타입을 설정할 때 사용
JavaScript의 프로토타입 체인을 이해하는 것은 객체 지향 프로그래밍을 효과적으로 사용하는 데 필수적입니다. 프로토타입의 활용을 통해 코드의 재사용성과 가독성을 높일 수 있으며, 효과적인 상속 구조를 만들어나갈 수 있습니다.

객체 상속의 매커니즘을 이해하고 활용함으로써, 개발자들은 더욱 효율적이고 강력한 소프트웨어를 제작할 수 있습니다.
PROTO와 proto 접근자
JavaScript에서 객체 지향 프로그래밍의 핵심은 객체 간 상속을 다루는 프로토타입 시스템입니다. 이와 관련하여 가장 많이 사용되는 두 가지 요소는 __proto__ 접근자 속성과 prototype입니다. 이러한 개념은 객체의 구조와 동작을 이해하는 데 필수적입니다.
__proto__의 역할과 작동
__proto__는 JavaScript 객체의 프로토타입에 접근할 수 있는 속성으로, 모든 객체가 기본적으로 갖고 있습니다. 이 속성을 통해 각각의 객체는 자신의 상위 객체, 즉 프로토타입 객체를 참조할 수 있습니다. 이를 통해 상속받은 프로퍼티와 메서드를 사용할 수 있습니다.
“모든 객체는 하나의 프로토타입을 갖고 있으며, 이 프로토타입은 객체의 생성 방식에 따라 결정된다.”
| 구분 | 설명 |
|---|---|
| 객체 리터럴 | 생성된 객체의 프로토타입은 Object.prototype이 된다. |
| 생성자 함수 | 생성된 객체의 프로토타입은 함수의 prototype 프로퍼티에 바인딩된다. |
예를 들어, const person = { name: 'cha' }라고 선언하면, person 객체의 프로토타입은 Object.prototype입니다. 즉, person은 기본적으로 Object의 모든 메서드와 프로퍼티를 사용할 수 있습니다.
__proto__의 올바른 사용법
__proto__ 접근자 속성은 직접적으로 사용하기보다는 우회적으로 접근하는 방식이 더 안전합니다. JavaScript 엔진은 객체의 메서드에 접근할 때, 해당 객체에서 원하는 프로퍼티를 찾지 못하면 __proto__가 가리키는 프로토타입에서 검색을 시작합니다. 이 과정에서 순환 참조를 방지하기 위해 한 방향으로만 참조할 수 있도록 설계되어 있습니다.
const obj = {};
const parent = { x: 1 };
// getter를 사용하여 obj의 프로토타입을 참조
console.log(obj.__proto__);
// setter를 사용하여 새로운 프로토타입 지정
obj.__proto__ = parent;
console.log(obj.x); // 1
하지만 __proto__를 사용하여 프로토타입을 설정하는 것은 권장되지 않습니다. 그 대신 아래의 메서드를 사용하는 것이 더 안전하고 효과적입니다:
Object.getPrototypeOf(obj): 특정 객체의 프로토타입을 가져올 때 사용Object.setPrototypeOf(obj, proto): 객체의 프로토타입을 변경할 때 사용
이렇게 함으로써, 자신이 proto 프로퍼티를 사용하지 않더라도 항상 안전하게 프로토타입을 관리할 수 있습니다.
마무리
총체적으로, __proto__ 접근자 속성은 JavaScript의 프로토타입 시스템의 기초적인 요소입니다. 이 속성을 통해 프로토타입 체인을 이해하고 활용하는 것이 가능합니다. 그러나 직접적인 사용은 피하고, 제공된 메서드를 적극 활용하여 코드의 안전성을 높이는 것이 중요합니다. 프로토타입은 객체 지향 프로그래밍의 본질적인 개념으로, 이를 잘 이해하면 JavaScript의 힘을 더욱 체감할 수 있습니다.

PROTO와 근본적인 메서드
자바스크립트에서 프로토타입은 객체 간 상속을 관리하는 중요한 개념입니다. 이를 통해 객체는 자신의 부모 객체에서 속성과 메서드를 물려받을 수 있습니다. 이 섹션에서는 객체의 프로토타입을 쉽게 관리할 수 있게 해주는 두 가지 주요 메서드인 object.getPrototypeOf와 object.setPrototypeOf에 대해 알아보겠습니다.
object.getPrototypeOf 활용하기
object.getPrototypeOf 메서드는 특정 객체의 프로토타입을 조회하는 데 사용됩니다. 이 메서드를 통해 객체가 어떤 프로토타입을 가지고 있는지 쉽게 확인할 수 있습니다. 이를 통해 객체의 상속 관계를 이해하고, 관련 속성을 추적하는 데 도움을 줍니다.
“객체의 프로토타입을 이해하는 것은 자바스크립트의 상속 구조를 이해하는 첫걸음이다.”
다음 표는 object.getPrototypeOf 메서드의 사용법을 요약합니다:
| 코드 예제 | 설명 |
|---|---|
| const obj = {}; | 빈 객체 생성 |
| const proto = { x: 1 }; | 프로토타입 객체 생성 |
| Object.setPrototypeOf(obj, proto); | obj의 프로토타입을 proto로 설정 |
| console.log(Object.getPrototypeOf(obj)); | obj의 프로토타입 확인 |
위의 과정을 통해 obj 객체는 proto 객체의 속성을 사용할 수 있으며, object.getPrototypeOf(obj)를 호출하면 proto를 반환받게 됩니다. 이렇게 함으로써 더 나은 이해와 오류 방지를 할 수 있습니다.
object.setPrototypeOf로 프로토타입 교체
object.setPrototypeOf 메서드는 객체의 프로타입을 변경할 수 있도록 해줍니다. 이 메서드를 통해 기존 객체의 프로토타입을 다른 객체로 교체할 수 있습니다. 하지만 주의해야 할 점은, 이 메서드는 성능 저하를 초래할 수 있으므로 신중하게 사용해야 한다는 것입니다.
다음 코드는 object.setPrototypeOf의 사용 예시를 보여줍니다:
const obj = {};
const parent = { x: 1 };
// obj의 프로토타입을 parent로 설정
Object.setPrototypeOf(obj, parent);
console.log(obj.x); // 1
위의 코드에서 obj 객체는 이제 parent 객체의 속성을 상속받게 됩니다. 이처럼 프로토타입을 교체함으로써, 필요한 속성을 동적으로 이용할 수 있습니다.
하지만 상속 구조의 혼란을 방지하기 위해서 __proto__ 접근자 프로퍼티를 직접 사용하는 것은 지양해야 합니다. setPrototypeOf 메서드를 통해 명시적으로 프로토타입을 설정하면, 코드의 가독성을 높이고, 순환 참조에 대한 위험성을 줄일 수 있습니다.

이와 같이 자바스크립트에서 프로토타입을 효율적으로 다룰 수 있는 메서드들을 활용하면, 더 유연하고 안정적인 코드를 작성할 수 있습니다. 프로토타입의 사용은 객체 지향 프로그래밍의 강력함을 제공하며, 이를 통해 코드의 재사용성을 극대화할 수 있습니다.
PROTO 체인을 통한 상속 방식
자바스크립트에서 상속을 구현하는 중요한 механизм은 프로토타입 체인입니다. 이 체인은 객체 간의 프로퍼티 및 메서드 공유를 가능하게 합니다. 이번 섹션에서는 프로토타입 체인의 기본 개념과 먼저 접근하는 프로퍼티에 대해 심층적으로 살펴보겠습니다.
프로토타입 체인이란?
프로토타입 체인(prototype chain)은 자바스크립트에서 객체가 다른 객체의 프로퍼티를 참조할 수 있는 구조입니다. 모든 객체는 **[[prototype]]**이라는 내부 슬롯을 가지며, 이 슬롯은 해당 객체의 프로토타입을 가리킵니다. 자바스크립트 엔진이 객체의 프로퍼티에 접근할 때, 해당 프로퍼티가 존재하지 않는 경우 프로토타입 체인을 따라 부모 객체의 프로퍼티를 검색합니다.
“만약 proto 접근자가 없다면, 프로토타입 체인 없이 상속 구현이 불가능했을 것입니다.”
프로토타입의 생성 및 연결
- 객체는 다양한 방식으로 생성할 수 있으며, 이때 프로토타입은 결정됩니다.
- 예를 들어, 객체 리터럴로 생성한 객체는
Object.prototype을 프로토타입으로 갖고, 생성자 함수를 이용한 객체는 해당 함수의prototype속성을 따릅니다.
객체의 프로토타입 체인
모든 객체는 하나의 프로토타입을 가져야 하며, 이는 마치 나무의 가지처럼 연결되어 있습니다. 최상위 객체인 Object.prototype는 모든 객체에 상속되어 있습니다.
| 생성 방식 | 프로토타입 |
|---|---|
| 객체 리터럴 | Object.prototype |
| 생성자 함수 | 해당 생성자 함수의 prototype |

먼저 접근하는 프로퍼티
자바스크립트에서 각 객체는 프로토타입을 통해 공유된 기능과 데이터에 접근할 수 있습니다. 이 접근은 proto 접근자 프로퍼티를 통해 이루어집니다. proto는 객체가 직접 소유하는 프로퍼티가 아니라 Object.prototype의 프로퍼티로, 객체의 부모 프로토타입을 쉽게 가져올 수 있게 해줍니다.
__proto__의 사용 및 권장 사항
직접적으로 **[[prototype]]** 내부 슬롯을 사용하지 않고, proto를 사용해 접근하는 이유는 순환참조를 방지하기 위해서입니다. 예를 들어, 자녀 객체가 부모 객체를 가리키고 부모 객체가 자녀를 가리키는 식의 순환참조가 생기면 에러가 발생할 수 있습니다. 이는 코드의 복잡성을 초래할 수 있으므로 피해야 합니다.
따라서, 프로토타입을 가져오거나 설정할 때는 다음의 메서드를 사용하는 것이 좋습니다:
- Object.getPrototypeOf(): 프로토타입 참조를 취득
- Object.setPrototypeOf(): 프로토타입을 교체
이 메서드들은 보다 명확하게 의도를 나타내며, 코드의 가독성을 향상시킵니다.
마무리
프로토타입 체인은 자바스크립트의 핵심 개념으로, 객체 간의 상속을 가능하게 합니다. proto 접근자는 이 체인을 통해 프로퍼티에 접근하는 데 도움을 주지만, 사용 시 주의가 필요합니다. 객체의 상속 구현 방식을 이해하고 올바른 방법으로 접근한다면, 더욱 효율적이고 유지보수가 용이한 코드를 작성할 수 있을 것입니다.
PROTO 순환참조 방지 기능
순환참조 문제 설명
자바스크립트에서 순환참조는 객체 간의 상호 참조로 인해 발생하는 문제입니다. 이러한 상황에서는 두 객체가 서로의 프로토타입을 참조하게 되며, 이로 인해 무한 루프가 생길 수 있습니다. 예를 들어, 다음과 같은 코드에서 순환참조가 발생합니다:
const parent = {};
const child = {};
child.__proto__ = parent; // child 프로토타입 설정
parent.__proto__ = child; // parent 프로토타입을 child로 설정
이처럼 두 객체가 서로를 참조하게 되면, 자바스크립트 엔진은 한 객체의 프로퍼티를 찾기 위해 부모 프로토타입을 탐색하던 중 다시 원래 객체로 돌아가게 되어 무한 루프에 빠집니다. 이는 프로토타입 체인을 깨뜨리며, 코드의 오류를 일으키므로 반드시 피해야 할 상황입니다.
“프로토타입 체인은 단방향 링크드 리스트로 구현되어야 하며, 순환참조는 이를 방해할 수 있다.”
안전한 프로토타입 관리
안전한 프로토타입 관리를 위해서는 proto 접근자 프로퍼티 사용을 자제하고, 대신 공식 메서드인 Object.getPrototypeOf()와 Object.setPrototypeOf()를 활용하는 것이 권장됩니다. 이 방법은 순환참조의 위험을 줄이고, 명확하게 프로토타입을 관리할 수 있도록 도와줍니다.
| 메서드 | 설명 |
|---|---|
Object.getPrototypeOf() |
주어진 객체의 프로토타입을 반환합니다. |
Object.setPrototypeOf() |
주어진 객체의 프로토타입을 설정합니다. |
이러한 메서드를 사용하면 코드의 안전성을 높일 수 있으며, 예기치 못한 오류를 예방하는 데 기여할 수 있습니다.
자바스크립트의 프로토타입 시스템을 잘 이해하고 관리하는 것은 프론트엔드 개발에서 필수적인 요소입니다. 안전한 프로토타입 관리를 통해, 더 나은 코드 품질과 유지보수성을 확보할 수 있습니다!

PROTO를 활용한 자바스크립트 정리
자바스크립트에서 프로토타입은 객체 간의 상속을 구현하는 데 사용되는 중요한 개념입니다. 이 글에서는 프로토타입의 정의와 함께 상속 개념을 정리하고, 실습 예제를 통해 이를 더 깊이 이해하고자 합니다.
상속 개념 정리하기
자바스크립트의 프로토타입은 객체의 부모 역할을 수행하며, 하위 객체는 상위 객체의 속성과 메서드를 공유할 수 있습니다. 각 객체는 **[[prototype]]**이라는 내부 슬롯을 가지고 있고, 이 슬롯의 값은 해당 객체의 프로토타입을 참조합니다. 객체가 생성될 때의 방식에 따라 이 프로토타입은 달라집니다.
예를 들어, 리터럴 방법으로 생성된 객체는 Object.prototype을 기본 프로토타입으로 가집니다. 반면, 생성자 함수를 통해 생성된 객체는 해당 생성자 함수의 prototype 속성에 연결된 객체를 프로토타입으로 가집니다.
이러한 프로토타입 개념을 통해 각 객체는 부모 객체의 속성을 상속받을 수 있으며, 프로토타입 체인(prototype chain) 구조를 통해 필요한 속성을 찾아 갈 수 있습니다.
“모든 객체는 하나의 프로토타입을 가지며, 모든 프로토타입은 생성자 함수와 연결돼 있다.”
실습 및 예제 코드 제공
프로토타입을 통한 상속을 이해하기 위한 간단한 예제를 살펴보겠습니다. 다음 코드는 두 개의 객체를 생성하고, 상속 관계를 설정하는 과정을 보여줍니다.
const parent = {
x: 1,
getX: function() {
return this.x;
}
};
const child = Object.create(parent); // parent를 프로토타입으로 갖는 child 객체 생성
console.log(child.getX()); // 1, child는 parent의 메서드를 상속받음
child.x = 2; // child에 x 속성 추가
console.log(child.getX()); // 2, child의 x 값 변경
console.log(parent.getX()); // 1, parent의 x는 변하지 않음
위 예제에서 child 객체는 parent 객체를 프로토타입으로 가지며, 그로 인해 parent의 메서드와 속성을 접근할 수 있습니다. 여기서 Object.create(parent)를 사용하여 parent를 프로토타입으로 설정한 점이 핵심입니다.
이처럼 프로토타입을 활용하면 유연한 상속 체계를 구축할 수 있습니다. 하지만 __proto__ 접근자 프로퍼티를 직접 사용하기보다는, Object.getPrototypeOf() 및 Object.setPrototypeOf() 메서드를 통해 프로토타입을 관리하는 것이 더 안전하고 권장되는 방법입니다
.
프로토타입을 이해하고 활용하는 것은 자바스크립트의 핵심 개념 중 하나이며, 이를 통해 객체 지향 프로그래밍을 더욱 효과적으로 수행할 수 있습니다.








