JavaScript를 공부하다 보면 클래스, Prototype, this, 호이스팅, 실행 컨텍스트 같은 낯설고 복잡한 개념들을 자주 접한다.
하지만 대부분의 자료는 사용법과 중요성만 설명할 뿐, 왜 이런 개념이 필요했는가에 대해서는 잘 다루지 않는다.
그래서 자연스럽게 “왜?”라는 질문이 따라온다.
이 의문을 풀기 위해 여러 글을 읽던 중,
“자바스크립트는 왜 프로토타입을 선택했을까?”라는 글을 발견했고, 그 내용을 바탕으로 정리해 본다.
“물질적인 사물은 이데아에 비하면 그림자나 다름없다.” – 플라톤
플라톤에 따르면, 이데아는 완전무결한 본질, 즉 이상적인 형태다.
우리 주변의 사물들은 모두 이데아를 모방한 불완전한 존재에 불과하다.
예를 들어 “사람”이라는 개념을 이해할 수 있는 이유는, 이데아 속에 이미 완벽한 “사람”의 형태가 존재하기 때문이다.
이러한 철학적 개념은 곧 객체지향 프로그래밍의 클래스와 닮아 있다.
class Person {
// ...
}
const hong = new Person();
Person: 추상적 청사진(이데아)hong: 그 청사진으로부터 생성된 구체적 인스턴스👉 클래스 기반 언어(Java, C++, C# 등)는 이처럼 플라톤적 이데아를 모델로 삼는다.
플라톤의 제자인 아리스토텔레스는 한 걸음 더 나아가, 공통 속성을 기준으로 개체를 분류하는 방식을 제시했다.
즉, 단순히 완벽한 형태를 상정하는 데서 그치지 않고, 실제 사물을 구별할 수 있는 기준을 마련한 것이다.
예시 – 사람의 분류:
프로그래밍에서 클래스 역시 이러한 분류법의 구현 도구라고 할 수 있다.
예컨대 class Person은 공통 속성을 정의하고, 그로부터 사람 객체들을 만들어 낸다.
하지만 이 방식에는 한계가 있다.
👉 속성만으로는 모호한 분류가 생길 수 있다.
이 모호함은 훗날 비트겐슈타인이 제시한 새로운 관점과 연결된다.
“공유 속성만으로 정의할 수 없는 개념이 있다.” – 비트겐슈타인
20세기의 비트겐슈타인은 아리스토텔레스의 고정된 분류법을 반박하며 맥락과 유사성의 중요성을 강조했다.
즉, 사물이나 개념을 하나의 기준으로만 구분할 수 없으며, 상황과 맥락에 따라 달라질 수 있다는 것이다.
의미사용이론: 언어의 의미는 맥락에 따라 달라진다.
가족유사성 이론: 공통 속성이 없어도 유사성으로 범주를 형성할 수 있다.
이러한 새로운 시각은 인지과학자 로쉬(Eleanor Rosch)의 Prototype 이론으로 이어지며,
나아가 JavaScript의 Prototype 개념과 맞닿게 된다.
로쉬에 따르면 범주는 고정된 속성이 아니라 전형적인 사례(Prototype)를 중심으로 형성된다.
즉, 우리가 어떤 개념을 이해할 때 가장 먼저 떠올리는 대표적인 사례가 그 범주를 정의하는 데 핵심이 된다.
예시:
JavaScript는 이 이론을 언어 설계에 반영하였다.
즉, 객체가 다른 객체(Prototype)를 참조하여 속성과 메소드를 상속받는 구조로 만들어졌다.
const person = { speak() { console.log("Hello"); } };
const hong = Object.create(person);
hong.speak(); // "Hello"
특징
👉 따라서 JavaScript는 “분류” 중심이 아닌, 맥락적 유사성을 채택한 언어라 할 수 있다.
이는 앞서 살펴본 철학적 논의들이 프로그래밍 언어 설계에 어떻게 반영되었는지를 잘 보여준다.
즉, JavaScript의 핵심 개념들(실행 컨텍스트, 스코프 체인, 클로저, this, 호이스팅 등)은
결국 맥락(Context)을 어떻게 정의하고 다루는가의 문제와 맞닿아 있다.
프로그래밍 언어를 배운다는 것은 단순히 문법을 외우는 일이 아니다.
그 기능들이 왜 존재하는가를 이해하는 과정이다.
특히 JavaScript와 같이 Prototype 기반 객체지향 언어는,
그 철학적 기원을 이해할 때 훨씬 더 깊이 있게 활용할 수 있다.
따라서 “왜?”라는 질문을 두려워하지 않고 학습의 도구로 삼는다면,
언어의 본질에 한 걸음 더 가까이 다가갈 수 있을 것이다.