Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

박철순

Javascript Prototype 본문

Javascript

Javascript Prototype

박철순입니다 2022. 4. 6. 20:16

자바스크립트는 프로토타입 기반의 언어로 기존의 클래스(객체)형의 언어들과 차별점을 두고 있다.
클래스(객체)형은 서양철학은 이분법적 세계관을 가지고 있기에, 서양권에서 만들어진 언어다 보니 자연스레 이분법적을 가지고 있다.
레퍼런스 타입이라 불리는 Chair 클래스는 이데아에 존재하는 추상적인 개념입니다. 메모리상에는 존재하지 않다가, const 만들객체명 = new 클래스명()을 통해 메모리에 존재합니다.
즉, Class Chair { } 의 형태는 이데아에 존재하는 본질적인, 추상적인 의자. 현실세계에 존재하지 않는다. new 키워드를 이용해서 new Chair() 를 하는 순간 추상적으로만 존재하던 의자가 메모리라는 현실세계에 구체적으로 존재(인스턴스화)하게 됩니다.
이분법적이란? 영혼/육체, 추상적/구체적, 이데아/프랙티스 등 2가지로 눈앞에 실제로, 구체적으로 존재하는 사물이 있다면 반드시 그것의 본질이 존재를 의미합니다.

‘분류(classification)'란 개념으로 정립 = 개체의 속성이 동일한 경우 개체 그룹이 같은 범주에 속한다. 범주는 정의와 구별의 합이다

그러나, 프로타입은 의미사용이론을 기반으로 했기에, 사용(use)에 의해 의미(meaning)가 결정된다는 이론이다. 단어의 쓰임새가 곧 의미가 됩니다. 
즉, 단어의 '진정한 본래의 의미'란 존재하지 않고 '상황과 맥락에 의해서 결정된다'.
컨텍스트(맥락)로 프로토타입 기반 언어의 실행 컨텍스를 설명할 수 있습니다.

그리고 갈색 머리, 안경, 수염, 큰 코가 가족의 전형적인 특징이라고 하더라도 모든 가족 구성원에게 적용되는 공통된 특성(속성)은 없을 수 있습니다. 
그런데도 우리는 전형적인 특징을 통해 ‘가족'으로 분류합니다. 이런 분류 방식을 ‘가족 유사성' 에 의한 분류라고 합니다.

의미사용이론, 가족 유사성은 1970년경 철학자 Eleanor Rosch 에 의해 프로토타입 이론(Prototype theory)으로 정리됩니다.
“인간은 ‘등급이 매겨진 (개념) 구조(graded structure)’를 가진다”라고 주장합니다. 
인간은 사물을 분류할 때 자연스럽게 가장 유사성 높은 것 순서대로 등급을 매긴다는 의미로 볼 수 있습니다. 
이렇게 분류했을 때 가장 높은 등급을 가진 녀석이 나올 텐데요, 이것이 바로 원형(Prototype)이다. 란 주장이 프로토타입 이론입니다.

프로토타입 기반 OOP 언어의 특징은 다음과 같습니다.
· 개별 객체(instance) 수준에서 메소드와 변수를 추가
· 객체 생성은 일반적으로 복사를 통해 이루어짐
· 확장(extends)은 클래스가 아니라 위임(delegation)
  > 현재 객체가 메시지에 반응하지 못할 때 다른 객체로 메시지를 전달할 수 있게 하여 상속의 본질을 지원
· 개별 객체 수준에서 객체를 수정하고 발전시키는 능력은 선험적 분류의 필요성을 줄이고 반복적인 프로그래밍 및 디자인 스타일을 장려
· 프로토타입 프로그래밍은 일반적으로 분류하지 않고 유사성을 활용하도록 선택
· 결과적으로 설계는 맥락에 의해 평가

호이스팅이란? 실행 컨텍스트 생성 시 렉시컬 스코프 내의 선언이 끌어올려 지는 게 호이스팅이다.
자바스크립트에서는 ‘단어의 의미가 사용되는 근처 환경’ 에서의 ‘근처'를 어휘적인 범위(Lexical Scope)로 정의
자바스크립트 엔진은 코드가 로드될 때 실행 컨텍스트를 생성하고 그 안에 선언된 변수, 함수를 실행 컨텍스트 최상단으로 호이스팅 합니다. 이러한 범위를 렉시컬 스코프라 합니다.

프로토타입 언어인 자바스크립트에 도대체 왜 ‘실행 문맥', ‘렉시컬 스코프', ‘호이스팅'이 존재하는가 입니다. 
이유는 프로토타입 철학의 근원인 비트겐슈타인류에서 가장 중요하게 생각하는 것이 바로 ‘어휘'이고 이것은 ‘문맥(context)’ 내에서만 의미를 가진다는 것이 핵심입니다. 
이 핵심을 자바스크립트에서 구현하기 위해 자연스럽게 발생한 특징임을 이해한다면 더 이상 외울 필요가 없어집니다.

결론적으로, 누가,어디서 호출했냐에 따라 this,렉시컬스코프,프로토타입이 바뀝니다.


★★★★★★★★★★★★★★★★★ 프로토타입 동작원리 ★★★★★★★★★★★★★★★★★

자바스크립트는 기존의 객체를 복사하여 새로운 객체를 생성하는 프로토타입의 기반의 언어입니다.
프로토타입은 크게 2가지로 해석됩니다. 프로토타입 객체를 참조하는 prototype 속성과 객체 멤버인 proto 속성이 참조하는 숨은 링크가 있습니다.

함수에 prototype 속성이 있습니다. 이 속성은 다른 곳에 생성된 함수이름의 프로토타입 객체를 참조합니다. 
그리고, 프토토타입 객체 내부에 constructor 속성은 함수를 참조하는 내부구조를 가집니다. 즉, 서로가 서로를 참조하는 구조입니다.

정리하자면, 프로토타입 객체는 새로운 객체가 생성되기 위한 원형이 되는 객체입니다. 같은 원형으로 생성된 객체가 공통으로 참조하는 공간입니다.

생성자 함수의 protorype 속성이 참조하는 프로토타입 객체는 new 생성자함수를 통해 생성된 모든 객체의 원형(기본)이 되는 객체입니다. 생성된 모든 객체가 참조함
객체 안에는 proto(비표준) 속성이 있습니다. 이 속성은 객체가 만들어지기 위해 사용된 원형인 프로토타입 객체를 숨은 링크로 참조하는 역활을 합니다. * 추측상 Stack에 있는 객체가 Heap에 있는 메모리공간을 참조할 때 객체에 proto를 통해 참조하는 듯.

프로토타입에 공통사항으로 추가,수정,삭제를 할 때는 원본인 생성자 함수에 추가를 해야 하지만, 프로토타입을 읽을 때는 생성(복사)된 함수를 통해서만 읽을 수 있습니다.
그리고, 개별적으로 추가,수정,삭제를 할 때는 생성(복제)된 함수로도 가능합니다.
ex) [ Person.prototype.getType = function () {}을 통해 공통사항을 추가,수정,삭제 ],[ const joon = new Person(); joon.age = 25;을 통해 개별적으로 추가,수정,삭제 ] 

프로토타입 체인 구조 때문에 모든 객체는 Object의 자식이라고 불리고, Object Prototype Object에 있는 모든 속성을 사용할 수 있습니다. 

 


https://medium.com/@bluesh55/javascript-prototype-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-f8e67c286b67

 

[Javascript ] 프로토타입 이해하기

자바스크립트는 프로토타입 기반 언어라고 불립니다. 자바스크립트 개발을 하면 빠질 수 없는 것이 프로토타입인데요. 프로토타입이 거의 자바스크립트 그 자체이기때문에 이해하는 것이 어렵

medium.com

 

https://medium.com/@limsungmook/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%8A%94-%EC%99%9C-%ED%94%84%EB%A1%9C%ED%86%A0%ED%83%80%EC%9E%85%EC%9D%84-%EC%84%A0%ED%83%9D%ED%96%88%EC%9D%84%EA%B9%8C-997f985adb42

 

자바스크립트는 왜 프로토타입을 선택했을까

프로토타입으로 검색하면 으레 나오는 서두처럼 저 또한 자바스크립트를 처음 접했을 때 가장 당황스러웠던 게 프로토타입이었습니다.

medium.com

 

'Javascript' 카테고리의 다른 글

Math.max()  (0) 2022.04.21
Math.pow(), Math.sqrt()  (0) 2022.04.09
Javascript 비동기란?  (0) 2022.04.06
Javascript Event  (0) 2022.04.06