자바스크립트는 객체 기반의 프로그래밍 언어이며 자바스크립트를 이루고 있는 거의 모든 것들이 객체라고 한다
객치지향 프로그래밍은 사물이나 개념을 인식하는 철학적 사고를 프로그래밍에 접목하려는 시도에서 시작한다.
실체는 특징이나 성질을 나타내는 속성(property 또는 attribute)을 가지고 있고, 이를 통해 실체를 인식하거나
구별할 수 있다.
사람은 이름, 주소 , 성별 , 나이, 신장 ,체중 등 다양한 속성을 갖고 이때 이름은 홍길동이고 성별은 남성이며 나이는 20세인 사람
과 같이 속성을 구체적으로 표현하며 특정한 사람을 다른 사람과 구별하여 인식할 수 있다.
사람에게는 다양한 속성이 있으나 구현하는 프로그래밍에서는 사람의 이름과 주소라는 속성에만 관심이 있다고 가정했을 때
다양한 속성 중에서 프로그래밍에 필요한 속성만 간추려 내어 표현하는 것을추상화라고 한다.
위 사진에서는 person이라는 변수에 그 person이라는 객체가 가지는 속성들을 입력해주었다.
이처럼 속성을 통해 여러 개의 값을 하나의 단위로 구성한 복합적인 자료구조를 객체라 하며,
객체지향 프로그래밍은 독립적인 객체의 집합으로 프로그램을 표현하려는 프로그래밍 패러다임 이디.
위 사진에서는 person이라는 객체의 person이 가지는 동작을 입력해주기 위해
run()이라는 메서드를 만들어서 person객체에 넣어 주었다.
객체는 상태를 나타내는 데이터와 상태 데이터를 조작할 수 있는 동작을 묶어 생각한다.
이때 객체의 상태는 프로퍼티(property) 동작을 (method)라고 부릅니다.
상속과 프로토타입
상속은 객체지향 프로그래밍의 핵심 개념으로 어떤 객체가 프로퍼티 또는
메서드를 다른 객체가 상속받아 그대로 사용할 수 있는 것을 말합니다.
위 사진에서는 Person 생성자 함수가 생성하는 모든 객체(인스턴스)는 name프로퍼티와 run 메소드를 갖는다.
name 프로퍼티 값은 인스턴스마다 다르다. 하지만 run 메서드는 모든 인스턴스가 동일한 내용의 메서드를 사용하므로
단 하나만 생성하여 모든 인스턴스가 공유해서 사용하는 것이 바람직하다.
이때 상속을 통해 불필요한 중복을 재거할 수 있다. 자바스크립트는 프로토타입(prototype)을 기반으로 상속을 구현합니다.
위 사진에서는 Person 생성자 함수가 생성한 모든 인스턴스는 자신의 프로토타입, 즉 상위 (부모) 객체 역할을 Person.prototype의 모든
프로퍼티와 메소드를 상속받는다.
run 메소드는 단하만 생성되어 프로토타입인 Person.prototype의 할당되어 있다.
따라서 Person생성자 함수가 생성하는 모든 인스턴스는 run 메소드를 상속받아 사용할 수 있다.
자신의 상태를 나타내는 name프로퍼티만 개별적으로 소유하고 내용이 동일한 메서드는 상속을 통해 공유하여 사용하는 것이다.
프로토타입
프로토타입 객체란 객체지향 프로그래밍의 근간을 이루는 객체 긴 상속을 구현하기 위해 사용된다.
프로토타입은 어떤 객체의 상위 객체의(부모) 역할을 하는 객체로서 다른 객체에 공유 프로퍼티를 제공한다.
프로토타입을 상속받은 하위(자식) 객체는 상위 객체의 프로퍼티를 자신의 프로퍼티처럼 자유롭게 사용할 수 있다.
모든 객체는 Prototype이라는 내부 슬롯을 가지며, 이 내부 슬롯의 값은 프로토타입의 참조다.
Prototype에 저장되는 프로토타입은 객체 생성 방식에 의해 결정된다. 객체가 생성될 때 객체 생성 방식에 따라
프로토 타입이 결정되고 Prototype공간에 저장된다.
__proto__ 접근자 프로퍼티
자바스크립트에서는 내부 슬롯과 내부 메서드에 직접적으로 접근하거나 호출할 수 있는 방법을 제공하지 않는다고 한다.
단 일부 메서드에 한해서 간접적으로 접근할 수 있는 수단을 제공하기는 한다. 그 방법이 __proto__라는 접근자 프로퍼티이다.
__proto__접근자 프로퍼티는 객체가 직접 소유하는 것이 아니라 Object.prototype의 프로퍼티다.
모든 객체는 상속을 통해 Object.prototype.__proto__ 접근자 프로퍼티를 사용할 수 있다.
결론으로 모든 객체가 가지고 있는 prototype의 공간은 Object.prototype으로부터 상속받은 것이며
__proto__ 접근자 프로퍼티 또한 상속 받음으로써 모든 객체는 동일한 프로토 타입을 가리킨다.
'javascript' 카테고리의 다른 글
parameter 와 argument(인수, 인자) (0) | 2023.02.22 |
---|---|
비동기와 Promise (0) | 2022.12.13 |
call by value란? (0) | 2022.12.01 |
유사배열 (0) | 2022.12.01 |
var 와 let 과 const 블록레벨 스코프 (0) | 2022.11.26 |