JavaScript와 Prototype: 분류보다 맥락

JIIJIIJ·2024년 3월 8일
0

JavaScript

목록 보기
19/23

JavaScript는 왜 Prototype을 선택하였는가

JavaScript를 공부하다 보면 클래스, Prototype, this, 호이스팅, 실행 컨텍스트 같은 낯설고 복잡한 개념들을 자주 접한다.
하지만 대부분의 자료는 사용법과 중요성만 설명할 뿐, 왜 이런 개념이 필요했는가에 대해서는 잘 다루지 않는다.

그래서 자연스럽게 “왜?”라는 질문이 따라온다.

이 의문을 풀기 위해 여러 글을 읽던 중,
“자바스크립트는 왜 프로토타입을 선택했을까?”라는 글을 발견했고, 그 내용을 바탕으로 정리해 본다.


1. 플라톤의 이데아와 클래스

“물질적인 사물은 이데아에 비하면 그림자나 다름없다.” – 플라톤

플라톤에 따르면, 이데아는 완전무결한 본질, 즉 이상적인 형태다.
우리 주변의 사물들은 모두 이데아를 모방한 불완전한 존재에 불과하다.

예를 들어 “사람”이라는 개념을 이해할 수 있는 이유는, 이데아 속에 이미 완벽한 “사람”의 형태가 존재하기 때문이다.

이러한 철학적 개념은 곧 객체지향 프로그래밍의 클래스와 닮아 있다.

클래스와 이데아

class Person {
    // ...
}
const hong = new Person();
  • Person: 추상적 청사진(이데아)
  • hong: 그 청사진으로부터 생성된 구체적 인스턴스

👉 클래스 기반 언어(Java, C++, C# 등)는 이처럼 플라톤적 이데아를 모델로 삼는다.


2. 아리스토텔레스의 분류법과 클래스

플라톤의 제자인 아리스토텔레스는 한 걸음 더 나아가, 공통 속성을 기준으로 개체를 분류하는 방식을 제시했다.
즉, 단순히 완벽한 형태를 상정하는 데서 그치지 않고, 실제 사물을 구별할 수 있는 기준을 마련한 것이다.

예시 – 사람의 분류:

  • 이성, 언어 사용, 직립 보행을 가진 개체들을 “사람”으로 정의
  • 이를 통해 사람과 동물을 구별

프로그래밍에서 클래스 역시 이러한 분류법의 구현 도구라고 할 수 있다.
예컨대 class Person은 공통 속성을 정의하고, 그로부터 사람 객체들을 만들어 낸다.

하지만 이 방식에는 한계가 있다.

  • 돌고래: 물속에 살지만 어류가 아닌 포유류
  • 박쥐: 날개를 가졌으나 조류가 아닌 포유류

👉 속성만으로는 모호한 분류가 생길 수 있다.
이 모호함은 훗날 비트겐슈타인이 제시한 새로운 관점과 연결된다.


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

“공유 속성만으로 정의할 수 없는 개념이 있다.” – 비트겐슈타인

20세기의 비트겐슈타인은 아리스토텔레스의 고정된 분류법을 반박하며 맥락과 유사성의 중요성을 강조했다.
즉, 사물이나 개념을 하나의 기준으로만 구분할 수 없으며, 상황과 맥락에 따라 달라질 수 있다는 것이다.

핵심 개념

  1. 의미사용이론: 언어의 의미는 맥락에 따라 달라진다.

    • 화가에게 “물” = 그림 재료
    • 목마른 사람에게 “물” = 생수
  2. 가족유사성 이론: 공통 속성이 없어도 유사성으로 범주를 형성할 수 있다.

    • “게임”은 축구, 바둑, 컴퓨터 게임을 모두 포함하지만 명확한 공통 속성을 찾기 어렵다.

이러한 새로운 시각은 인지과학자 로쉬(Eleanor Rosch)의 Prototype 이론으로 이어지며,
나아가 JavaScript의 Prototype 개념과 맞닿게 된다.


4. Prototype 이론과 JavaScript

Prototype 이론

로쉬에 따르면 범주는 고정된 속성이 아니라 전형적인 사례(Prototype)를 중심으로 형성된다.
즉, 우리가 어떤 개념을 이해할 때 가장 먼저 떠올리는 대표적인 사례가 그 범주를 정의하는 데 핵심이 된다.

예시:

  • 참새: 전형적 사례(Prototype)
  • 타조, 펭귄: 범주에 속하지만 Prototype으로는 적합하지 않음

JavaScript의 Prototype

JavaScript는 이 이론을 언어 설계에 반영하였다.
즉, 객체가 다른 객체(Prototype)를 참조하여 속성과 메소드를 상속받는 구조로 만들어졌다.

const person = { speak() { console.log("Hello"); } };
const hong = Object.create(person);

hong.speak(); // "Hello"

특징

  1. 객체 단위에서 속성과 메소드 추가 가능
  2. 객체 생성은 복사(Object.create 등)로 이루어짐
  3. 확장은 클래스가 아닌 **위임(Delegation)**으로 처리
  4. 분류보다 유사성과 맥락을 중시

👉 따라서 JavaScript는 “분류” 중심이 아닌, 맥락적 유사성을 채택한 언어라 할 수 있다.
이는 앞서 살펴본 철학적 논의들이 프로그래밍 언어 설계에 어떻게 반영되었는지를 잘 보여준다.


5. 정리

  • 클래스 기반 언어: 플라톤의 이데아, 아리스토텔레스의 분류법 → 청사진과 분류 중심
  • Prototype 기반 언어: 비트겐슈타인, 로쉬의 사상 → 맥락과 유사성 중심

즉, JavaScript의 핵심 개념들(실행 컨텍스트, 스코프 체인, 클로저, this, 호이스팅 등)은
결국 맥락(Context)을 어떻게 정의하고 다루는가의 문제와 맞닿아 있다.


📌 결론

프로그래밍 언어를 배운다는 것은 단순히 문법을 외우는 일이 아니다.
그 기능들이 왜 존재하는가를 이해하는 과정이다.

특히 JavaScript와 같이 Prototype 기반 객체지향 언어는,
그 철학적 기원을 이해할 때 훨씬 더 깊이 있게 활용할 수 있다.

따라서 “왜?”라는 질문을 두려워하지 않고 학습의 도구로 삼는다면,
언어의 본질에 한 걸음 더 가까이 다가갈 수 있을 것이다.

profile
다크모드가 보기 좋아요

0개의 댓글