프로토타입 이론

김지영·2022년 6월 4일
0

자바스크립트

목록 보기
2/2
post-thumbnail

자바스크립트의 패러다임에 대해 궁금증을 가지던 중 명쾌한 답을 알려주는 글을 발견했다.

자바스크립트는 왜 프로토타입을 선택했을까? <-클릭

이 글을 읽고 자바스크립트의 본질에 대해서 조금은 알 수 있었다.

핵심은 프로토타입 이었다.

이전까진 프로토타입에 대해서는 그저 자바스크립트의 상속 방법 정도로만 알고있었다. 하지만 프로토타입을 왜 사용하는지는 모르고 있었다. 프로토타입이 나온 배경이나 아이디어에 대해서는 궁금해 하지도 않았었다. 다시 생각해보면 어떻게 궁금해 하지 않았는지 모르겠다. 당장의 상황에 급박해서 근본,본질을 생각하지 않는 공부를 한 탓일까?


1. 플라톤의 이데아

이 글의 초반에 나온 플라톤의 이데아에 대한 내용은 나의 생각방식을 바꾸어놓았다. 플라톤의 주장은 현실에 존재하는 객체들은 반드시 이데아에 그 추상적이고, 본질적인 것이 존재한다는 것이었다.

이러한 플라톤의 사고방식이 녹아든 것이 Java, c++같은 '클래스기반의 객체지향 프로그래밍 언어'였다. 이데아에 존재하는 추상적이고 본질적인 것이 클래스이고, 클래스를 이용해 현실세계로 존재하게(인스턴스화) 한 것이 객체였다.

2. 아리스토텔레스의 분류(classification)

플라톤의 제자 아리스토텔레스는 플라톤의 이데아 이론을 분류라는 개념으로 정립했다고 한다. 같은 본질을 가지는 객체들을 모아 하나의 범주로 묶은 것을 분류라고 정의 했다는 말 같다.

클래스라는 말도 아리스토텔레스의 classification에서 나오게 되었다는 것도 엄청난 충격이었다. 동일한 속성을 가지는 객체를 모아 그 추상적이고 본질적인 classificaiton을 만드는 것이 바로 클래스를 만드는 근본 아이디어 였다.

여태 '클래스 기반 객체지향 프로그래밍 언어'를 배우면서 이 개념을 몰랐다는것이 참 허탈했다. 내가 평소에 사용하던 언어가 플라톤과 아리스토텔레스라는 철학자의 아이디어로부터 파생되었고 그 구현체라는 것이 너무나도 놀랍다. 세상에 무엇하나 의미나 이유없이 만들어진 것이 없구나라는 생각이 들었다.

3. 비트겐슈타인의 의미사용이론, 가족유사성

그리고 드디어 내가 왜 그렇게 자바스크립트를 어려워했고, 이해하지 못했는지 이유를 알 수 있었다. 자바스크립트의 프로토타입은 아리스토텔레스의 분류 이론을 반박하는 비트겐슈타인의 의미사용이론과 가족유사성을 따르기 때문이었다.

다시 생각해보면 클래스를 정의하기란 생각보다 쉽지 않았던 것 같다. 문제 상황에 완전히 알맞는 속성과 연산을 가지는 클래스를 설계하기에는 예외가 생기면 수정해야할 부분이 많았다. 예를들어, 하위타입은 상위타입에 관계없는 멤버까지 구현/상속을 해야한다는 점이 말이다. 어떻게 상위타입의 속성을 모두 만족하는 하위타입 만 있다는 말인가.(사실 이게 올바른 예시인지 모르겠다)

비트겐슈타인은 '세계에 미리 내제되어서 대상과 언어를 완전히 규정하는 언어란 존재하지 않는다.' 고 하였다. 내 생각에 이 말의 의미가 이데아라는 본질적이고 추상적인 개념은 현실세계에 완벽히 존재할 수 없다는 것을 말해주는 것 같다. 그래서 그런 완벽한 이데아의 개념을 클래스로 만드는 것이 어려웠던 것이고.

그리고 비트겐슈타인은 '표현은 삶의 흐름속에서만 의미를 갖는다'라고 하였다. 이데아와 같은 본질적이고 추상적인 표현은 표현을 사용하는 상황에서 그 의미를 갖는다는 말인 것 같다.

의미사용이론
사용(use)에 의해 의미(meaning)가 결정된다는 이론. 단어의 쓰임새가 곧 의미가 된다. 즉, 단어의 ‘진정한 본래의 의미'란 존재하지 않고 ‘상황과 맥락에 의해서 결정된다'라고 주장한다.
상황과 맥락에 의해서 그 '무엇인가'의 의미가 결정된다는 말.

가족유사성
현실에서 인간이 무엇인가를 분류할때 속성을 포함하는지 여부가 아닌, 유사성을 통해 분류한다는 이론.

확실히 생각해보면, 현실에서 사람이 객체를 분류하고 그 의미를 사용할 때, 아리스토텔레스의 분류 이론보다는 비트겐슈타인의 가족유사성과 의미사용이론에 의한 경우가 많은것 같다.

예를들어, 사진을 분류할 때 특정 속성이 반드시 포함되었냐의 여부보다는 사용하는 목적이나 상황에 따르거나 유사한것끼리 묶는 것이 보통이다. 그리고 상황이나 사람에 따라 같은 사진을 분류하는 기준이 다르다.

결론적으로 사람이 객체를 분류한다는 것은 가족유사성과 의미사용이론에 의해 절대적이지 않고 상대적으로 분류된다는 말 같다.

4. 일레노어 로쉬의 프로토타입 이론

비트겐슈타인의 의미사용이론과 가족유사성은 일레노어 로쉬에 의해 정리된다.

프로토타입 이론
1. 인간은 등급이 매겨진 개념 구조를 가진다. 사물을 분류할 때도 자연스럽게 유사성이 높은 것 순서대로 등급을 매기는데, 여기서 가장 높은 등급을 원형(prototype)으로 선택한다.
2. 문맥(컨텍스트)에 따라 ‘범주’, 즉 ‘의미’가 달라진다. 누가 어떤 상황에서 객체를 접했는지에 따라 의미,범주가 달라진다.

일레노어 로쉬의 프로토타입 이론 <-클릭

5. 프로토타입 기반 객체지향 프로그래밍

프로토타입 기반 프로그래밍 <- 클릭

갑자기 예전에 신교수님이 객체지향이란 것은 현실세계(?)를 말한다고 했던 것이 기억난다. 그 땐 그 말이 너무 추상적이라고 생각했었는데 저 글을 읽고나니 왜 교수님이 그렇게 이야기 하셨는지 조금은 이해가 된다. 플라톤의 이데아, 아리스토텔레스의 분류, 비트겐슈타인과 일레노어 로쉬의 프로토타입 이론이 바로 현실세계의 본질을 이해하기 위한 이론들이기 때문에, 그 이론들을 컴퓨터 프로그래밍 언어로 녹여낸 클래스, 프로토타입 또한 객제지향이라고 말하는 것이 아닐까.

현실세계의 본질을 알기위해 생겨난 이론들이, 컴퓨터 프로그래밍 언어에 녹아들어, 현실 세계를 컴퓨터 프로그램으로 표현한 것이 객제치향 프로그래밍이 아닐까 하는 생각이 든다.

어쨋든, 저 글에서 '프로토타입 이론을 기반으로한 객제치향 프로그래밍의 특징'에 대해서도 설명을 해주었는데. 다음과 같다.

  • 개별 객체 수준에서 메소드와 변수를 추가
  • 객체 생성은 일반적으로 복사를 통해 이루어진다
  • 확장(extends)은 클래스가 아니라 위임(delegation)
    (현재 객체가 메세지에 반응하지 못할 때 다른 객체로 메세지를 전달할 수 있게 하여 상속의 본질을 지원한다.)
  • 개별 객체 수준에서 객체를 수정하고 발전시키는 능력은 선험적 분류의 필요성을 줄이고 반복적인 프로그래밍 및 디자인 스타일을 장려한다.
  • 결과적으로 설계는 맥락에 의해 평가된다.
  • 분류를 우선하지 않는다. 생성된 객체 위주로 유사성을 정의한다.
  • 어휘 쓰임새는 맥락에 의해 평가된다.
    (자바스크립트의 실행 컨텍스트, 스코프 체인이 여기서 파생되었다. 클로져, this, 호이스팅 등등이 프로토타입의 맥락을 표현하기 위한 것이다.)

아리스토텔레스의 분류(classification)는
1. 변수와 메소드를 미리 정의하는 클래스를 만든다. 상속을 통해 클래스를 확장 한다. (클래스 수준에서의 확장)
2. 그 클래스를 인스턴스화하여 변수와 메소드를 사용한다.

프로토타입은
1. 객체 수준에서 메소드와 변수를 추가한다. 객체를 확장할 때는 현재 존재하고 있는 객체를 프로토타입으로 연결해서 확장한다. (객체 수준에서의 확장)
2. 해당 객체를 사용하는 상황/문맥에 따라, 해당 객체를 사용하는 의미(쓰임새)가 달라진다.
(자바스크립트의 메소드는 실행하는 객체에 따라 this의 바인딩이 달라지는 것을 말하는 것 같다.)

ex) 청솔모 객체에 '꼬리','털색' 변수 와 '사냥방법' 메소드를 추가하고, 다람쥐 객체를 만들 때 청솔모 객체를 프로토타입으로 추가하고, '털색','사냥방법'을 수정하고 '동면'같은 다람쥐만의 함수를 추가할 수 있다는 말인것같다. 그리고 객체를 생성할 때는 복사를 통해 여러개를 만들 수 있다는 말 같음. 그리고 해당 객체를 사용하는 문맥에 따라 의미가 달라진다는 말은, 동일한 메소드를 청솔모와 다람쥐에 추가했다고 하더라도, 해당 메소드를 실행하는 주체객체에 따라 결과값이 달라질 수 있다는 말인 것 같음.

0개의 댓글