PracticeEveryday

JavaScript 본문

JavaScript

JavaScript

kimddakki 2022. 5. 17. 22:41
JavaScript는 왜 프로토타입을 선택했을까

"프로토타입은 자바스크립트에서 상속을 지원하기 위한 방법이다."

 

문제 1. 호이스팅

       2. this

" 호이스팅은 자바스크립트에서 전체 코드를 훑을 때 선언 부를 상단으로 올린다."

" this는 기본적으로 global(브라우저에선 window)을 가리키고 실행 컨텍스트마다 달라 질 수 있으니

  bind등을 통해 제어해야 한다."

 

요약

 - 프로토타입 기반 OOP : Object-Oriented Programming는 class 기반의 OOP와 완전히 상반되는 방식이다.

 - 객체를 바라보는 개념 자체가 완전히 다르다 특히 문맥(Context)을 매우 강조하는 철학적 근거에

   의해 태어난 녀석이라 렉시컬 스코프에 의한 호이스팅과 실행 문맥에 의한 복잡한 this가 필연적으로

   발생할 수 밖에 없었다.

 


플라톤과 이데아, 그리고 클래스 기반 객체지향 프로그래밍
서양 철학은 플라톤의 각주에 불과하다 - 화이트 헤드

 - 프로토타입을 이해하기 위해선 그 대척점에 있는 클래스의 기원을 알아야한다.

 - 클래스 기반 객체지향 언어( Java C#)를 오랫동안 해왔다면 이미 알고 있는 내용일 수도 있다.

 

 - 서양 철학은 이분법적 세계관을 갖고 있다.

 영혼 // 육체

 추상적 // 구체적

 이데아 // 프랙티스

 - 눈앞에 실제로, 구체적으로 존재하는 사물이 있다면 반드시 그것의 본질이 존재한다는 것이 플라톤의 주장이다.

 

 - 의자를 예로 들게 되면 우리가 앉아 있는 의자는 원목 의자, 바퀴 달린 의자, 하이 체어 등등여러가지 형태가

   존재하지만 이러한 수많은 의자가 실재로 존재하기 위해선 반드시 그 본질적이고 추상적은 '의자'라는 것이 존재해야

   한다는 것이다. 이러한 본질의 세계를 이데아 ( Idea )라고 한다. 

 - 현실의 모든 의자는 모두 이데아의 '의자'를 모방한 의자인 것이다!!

 

 - 영어권의 사고 방식에서는 이러한 이분법적인 세계관이 기본이다.

 - 영어의 "관사"를 예를 들어보면 이데아의 세계에 있는 것을 지칭할 때 "추상적인 존재"를 표현하는 기법이 있다.

 - 추상적인 의자를 이야기 할 때는 그냥 ' Chair '라고 얘기하는 것이 그 방법이다.

 - 그렇다면 현실에 존재하는 의자를 가리킬 땐 어떻게 해야 할까?

 - 현실에 존재를 이야기 할 때는 단어 그대로 이야기하지 못하고 반드시 " 때 "가 묻어있어야 한다.

 - 그래서 ' A Chair '라고 이야기 해야 한다!!

 

Chair : 이데아에 존재하는 본질적인 추상적인 의자 현실 세계에 존재하지 않는다.

A Chair, The Chair, Chairs : 현실 세계에 존재하는 의자

 - 이러한 사고방식이 프로그래밍 언어에도 자연스럽게 녹아들어 생긴 언어가 '클래스 기반 객체지향 언어'이다.

 => 대표적인 언어로는 Java C# 등이 존재한다.

class Chair {     
... 
}
Chair myChair = new Chair();

 - 위 코드에서 레퍼런스 타입이라 불리는 Chair 클래스는 이데아에 존재하는 추상적인 개념이다.

 => 즉 코드상으로만 존재하지 실제 메모리에는 존재하지 않는 것이다. 

      // 디테일하게 들어가면 PermGen 영역에 존재하겠지만 여기서는 Heap 메모리만 실종하는 공간으로 보자!

 

 - 그럼 현실 세계에서 존재하게 하려면 어떻게 해야 할까? 바로 new 키워드를 사용하면 된다.

 - new Chair()를 하는 순간 추상적으로 존재하던 의자가 메모리라는 현실 세계에 구체적으로 존재

   (인스턴스화)하게 된다.

 - 이런 클래스 방식의 OOP 언어는 플라톤류( Platonic ) 서양 철학의 자연스러운 흐름이 된다.

 

분류 Clasification

 - 이러한 플라톤의 이데아 이론은 그의 제자 아리스토텔레스에 의해 분류 ( Classification )란 개념으로 정립된다.

 - Class 라는 키워드가 어디서 나오게 된 것인지 알 수 있겠지?!

아리스토텔레스의 분류 정의
 - 개체의 속성이 동일한 경우 개체 그룹이 같은 범주에 속한다. 범주는 정의와 구별의 합니다.

 

 - 이는 전통적은 클래스 기반 객체 지향 프로그래밍의 아이디어 - 일반화 ( Generalization )과 정확히 일치한다.

 - 여기서 속성은 클래스의 프로퍼티가 되고 프로퍼티가 유사한 객체가 있다면 일반화 과정을 통해 클래스로

   추상화 된다!!

    // 범주 === 클래스 개체의 속성 === 프로퍼티

 

 - 실제로 아리스토텔레스틑 이러한 기준으로 현실 세계의 많은 것은 분류했고, 최초의 동물을 분류한 사람이 되었다.

 - 속성에 따른 분류로 인해 돌고래는 어류가 아닌 표유류가 되었던 것이다앗!


프로토타입 ( Prototype )
서양 철학은 플라톤의 각주에 불과하다 - 화이트 헤드
하지만 이 말에는 '비트겐슈타인 이전까지'라는 단서를 덧붙여야 한다 - 와스피 히잡

 - 프로토타입을 이해하기 위해선 분류 ( Classification )에 대해 반드시 알아야 할 필요가 있다.

 - 왜냐하면 프로토타입이란 개념이 분류 ( Classification ) 이론을 정면으로 반박하여 나온 이론이기 때문이다.

 

 " 공유 속성의 관점에서 정의하기 어려운 개념이 있다. === 사실항 올바른 분류란 없다 " - 비트겐슈타인

 

 - 위 이야기의 근거를 들고 온 것이 바로 '게임'이다. 게임은 일반적으로 승리와 패배가 명확하다.

 - 즉 '승리'와 '패배'라는 속성이 있다고 볼수 있다.

   하지만 비트겐슈나인은 이에 대한 반론으로 '승리', '패배'가 없는 'ring around a rosy'를 가지고 온다.

원을 그리머 노래하고 춤추다가 신호에 따라 웅크리는 놀이
Ring-around-a-rosie는 영어권에서 가장 널리 불려지는 동요중의 하나이다.

 - 이 게임은 빙글빙글 돌다가 다같이 주저 앉는 게임으로 누구도 승리 또는 패배하지 않는 게임이다.

 - 이 게임에는 공유 속성이 없다!!!

승리/ 패배? ring around a rosy에는 없다!
숙련도 여부? 행운 (주사위) 우주 게임은 없다!
플레이어 존재여부? 플레이거 전혀 필요하지 않는 게임도 있다!!

 - 특히 게임 외에도 예술 작품의 경우 공통 속성을 정의 할 수 없다. 

  => 즉, 좀 더 철학적으로 본다면 '게임', '예술' 등의 단어는 결코 속성으로 규정할 수 없는 것이다.

 

 " 세계에 미리 내재되어서 대상과 언어를 완전히 규정하는 어떤 언어란 존재하지 않는다 " - 비트겐슈타인

 

 - 블로그를 작성한 필자는 Java로 개발하는 동안 이와 같은 본질적은 한계를 많이 느꼈다고 한다.

   최적의 클래스 설계를 찾는 것이 너무 어려웠고 속성( Property )로 분류하는 것은 확장성을 고려했을 때 좋은 방식이

   아니었다고 한다. 정답이라 생각했던 설계도 개발이 진행되며 뒤엎는 경우도 많았고 멋들어진 상속 관계는 결국엔

   거대한 기술 부채가 되는 경우가 가끔 있었다고 한다.

 - 경력이 쌓이고 도메인 기반 설계, SOLID, 디자인 패턴 등을 통해 그럴싸한 클래스를 설계할 수 있었지만 이런 것을 

   숙달하기 까지 오랜 시간과 시행착오가 필요했다고 한다. 그러나 이 또한 한 번에 완벽한 디자인이 나오는 것이 

   불가능 하다 생각해 클래스란 너무 어렵다고 했다.

 

 - 이러한 분류 ( Classification )에 대해 강하게 비판한 비트겐 슈타인, 그의 대안은 그가 남김 다음의

   유명한 말에 등장한다

 

 " 표현읜 삶의 흐름 속에서만 의미를 갖는다 " - 비트겐슈타인

 

의미 사용 이론 ( The Use Theory of Meaning )

 - 의미 사용이론은 비트겐슈타인 일생의 후기에 내놓은 이론으로 사용( Use )에 의해 의미 ( Meanign )이

   결정된다는 이론이다. 단어의 쓰임새가 곧 의미가 된다.

 - 즉 단어의 '진정한 본래의 의미'란 존재하지 않고 '상황과 맥락에 의해서 결정된다'라고 주장하고 있다.

 - 그러니 단어의 의미를 백날 분석해 봤자 소용이 없다는 것이다.

 

비트겐슈타인은 '벽돌'을 예로 들었다

 누군가 벽돌! 이라고 외쳤을 때 상황마다 그 의미가 달라지게 된다.
 1. 벽돌이 필요할 때 => 벽돌을 달라!
 2. 벽돌로 보수해야 할 때 => 벽돌을 채우라
 3. 벽돌이 떨어질 때 => 벽돌을 피해라!

 - 맥락( Context )가 중요한 것이다!

 - 이 컨텍스트로 인해 프로토타입 기반 언어의 실행 컨텍스트를 설명할 수 있다.

가족 유사성 ( Family Resemblance )

 - 비트겐슈타인이 의미사용이론과 마찬가지로 주장한 다른 이론인 가족유사성이 있다.

 - 비트겐슈타인은 인간이 현실에서 실제로 대상을 분류할 때 속성( 전통적은 분류에서의 기준)이 아닌 

   가족 유사성을 통해 분류하게 된다고 이야기한다.

 - 위 그림처럼 가족이 있을 때 이 가족이 모두 공유하는 공통 속성은 존재하지 않는다.

 - 갈색 머리, 안경, 수염, 큰 코가 전형적인 특징이라고 하더라도 모든 가족 구성원에게 적용되는 

   공통된 특성 ( 속성 )은 없을 수가 있다.

 - 그럼에도 불구하고 우리는 이 그림을 보고 전형적인 톡징을 통해 '가족'으로 분류한다.

   이런 분류 방식을 '가족 유사성'에 의한 분류라고 한다.

 

 - 이 이론이 프로토타입 이론의 근거가 된다!!

 

Rosch의 프로토타입 이론

 - 비트겐슈타인의 의미사용이론, 가족 유사성은 1970년경의 철학자 Eleanor Rosh에 의해 

   ' 프로토타입 이론 ( Prototype Theory )으로 정립된다!!

 

1975년에 Rosch는 한가지 실험을 진행한다.

1. 실험 참가자들에게 여러 범주 구성원 ( 사과, 코코넛, 오렌지 )의 속성을 적어보라고 했다.
2. 각 범주 구성원에 대해 범주의 다른 구성원과 공유하는 속성의 개수를 도출했다.

사과, 오렌지 : 2점 => 둥글다, 즙이 있다.
코코넛 : 1점 둥글다

 - 점수가 높을 수록 '가족 유사성'이 높다고 볼 수 있다.

 - 전통적인 분류에 의해서는 모두 과일로 볼 수 있지만, 프로토타입 이론에서는 사과 오랜지가 가장 

   전형적인 무언가로 볼 수 있다. 반명 코코넛은 저 3개의 과일 중에서 가장 비 전형적인 것으로 볼 수가 있다.

 

 - 이 실험을 통해 로쉬는 "인간은 '등급이 매겨진 ( 개녀 ) 구조 ( Graded Structure )을 가진다 "라고 주장한다.

   인간은 사물을 분류할 때 자연스럽게 가장 유사성 높은 것 순서대로 등급을 매긴다는 의미로 볼 수 있다.

 - 이렇게 분류 했을 때 가장 높은 등급을 가진 녀석이 나오게 되는데 이것이 바로 원형 ( Prototype )이다.

   라는 프로토타입 이론이다

 

'새'를 예로 들어보자

'참새'는 새의 범주를 대표할 만한 가장 전형적인 녀석이다.
'참새'를 '원형 ( Prototype )으로 간주하자.

'타조'는 전통적인 분류에서는 같은 새가 되지만 프로토타입 이론에서는 '원형 ( Prototype )에
 가장 멀리 떨어진, 즉 '비전형적인' 녀석이 된다. 범주의 가장 끄트버리에 있는 녀석이 되는 것이다.

 

 => 즉 객체는 '정의'로부터 분류되는 것이 아니라 가장 보기 좋은 ( Prototype, Exemplar ) 로부터 범주화 된다고 한다.

 

 - 위와 같은 분류 체계는 매우 경제적인데, 우리가 새로운 대상을 접해서 분류할 때, 우리는 새로운 대상 몇 가지 특징만

   원형 ( Prototype )과 비교 확인만 하면 되는 것이다. 특징이 다를 수록 원형에서 멀 ~ 리 떨어진 범주가 되는 것이다.

 

 - 이 이론에 또 한 가지 중요한 것이 있다.

  => 바로 같은 단어라 할지라도 누가 어떤 상황 ( Context )에서 접했나에 따라 의미가 달라진 다는 것이다.

            ==> 의미사용이론

 

 - 예를 들만 아이가 생각하는 새의 범주에서 '참새'는 명확하게 새에 속하지만 '펭귄'은 해당 범주에 속하지 못 할 

   수가 있다. 아이가 생각 할 때 '펭귄'은 매우 비전형적이기 때문이다. 하지만 조류학자가 생각 할 땐 '참새'와 '팽귄'은

   명확하게 유사한 새의 범주에 속할 수가 있다. 같은 단어여도 어떤 상황 ( 누가, 어디서 ... )에서 접했나에 따라 범주는

   크게 달라지기 때문이다.

 

결론
현실에 존재하는 것중 가장 좋은 본보기를 원형 ( Prototype )으로 선택한다.

문맥 ( Context )에 따라 '범주' 즉 '의미'가 달라진다.

 

 

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

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

medium.com

 

'JavaScript' 카테고리의 다른 글

JavaScript  (0) 2022.05.18
JavaScript  (0) 2022.05.18
JavaScript  (0) 2022.05.15
JavaScript  (0) 2022.05.13
JavaScript  (0) 2022.05.12
Comments