Prototype 이론과 JavaScript 설계 철학

June·2025년 2월 16일
1
post-thumbnail

시작하며

많은 개발자들이 JavaScript를 처음 접하면 가장 먼저 부딪히는 벽 중 하나가 바로 this와 렉시컬 스코프입니다. 기존에 Java나 C#처럼 클래스 기반 언어만 다뤄봤다면, “왜 함수의 선언 위치와 호출 방식에 따라 this가 달라지지?”, “class 키워드가 생기기 전에는 대체 어떻게 상속을 했던 거지?” 같은 의문이 끊임없이 생기죠.

저 또한 처음엔 이러한 특징들을 이해하지 못해 한참 헤매며, “JavaScript는 왜 이렇게 독특하게 동작할까?” 라는 의문만 가지며 개발을 해왔던것 같습니다

프로그래밍 언어를 넘어 인지 공학의 [프로토타입 이론] 을 접하며 이 동작 방식이 단순히 기술적인 구조에서 비롯된 것이 아니라, 인간이 개념을 분류하고 학습하는 방식과 깊은 연관이 있음을 알게되었습니다

[객체 지향] 의 관점으로 본다면 JavaScript의 프로토타입은 클래스 기반 상속보다 현실 세계의 객체 관계를 더욱 직관적으로 반영한다고 볼 수 있습니다.

현실에서 객체는 개별적인 특성을 가지면서도 공통된 속성을 공유하는데, 프로토타입 기반 모델은 이러한 개념을 자연스럽게 구현합니다.

클래스 기반 vs 프로토타입 기반

클래스 기반 OOP

  • 플라톤적 이데아와 같이 사물의 본질(정적인 분류)을 전제로 합니다. 예를 들어, Java나 C#에서는 미리 정의된 클래스라는 틀(이데아)을 기반으로 인스턴스를 생성합니다. (아마 학교에서는 "붕어빵 틀" 과 같은 묘사를 자주 사용합니다)

프로토타입 기반 OOP

  • 가족 유사성비트겐슈타인의 의미사용이론을 반영합니다. 즉, 객체의 분류는 고정된 본질보다는 실제 사용되는 문맥과 상황에 따라 결정됩니다.
    • 가족 유사성: 우리가 어떤 범주나 집합에 속하는 대상들을 완벽하게 하나의 공통된 본질로 정의할 수 없음을 설명하는 개념입니다. 예를 들어, 가족을 생각해보면 모든 구성원이 똑같은 특징(예를 들어 눈 색깔, 키, 성격 등)을 공유하지는 않지만, 전체적으로 ‘가족’이라는 범주에 속한다고 인식합니다.
    • 의미사용이론은 단어 혹은 개념의 의미가 고정되어 있지 않고, 그것이 어떤 문맥(context)에서 어떻게 사용되는지에 따라 결정된다는 철학적 주장입니다.

프로토타입 이론의 핵심

원형(Prototype)의 개념

  • 프로토타입 이론에 따르면, 어떤 범주를 대표하는 가장 전형적인 원형이 존재하며, 새로운 객체는 이 원형과의 유사성을 기준으로 분류됩니다. 예를 들어, ‘참새’는 새 범주의 원형으로 작용하고, ‘타조’는 비전형적인 사례가 됩니다.

문맥에 따른 의미 결정

  • 단어의 의미는 그 단어가 사용되는 문맥(context) 에 따라 결정됩니다. 이는 JavaScript에서 렉시컬 스코프와 실행 컨텍스트가 작동하는 원리와도 유사합니다. 즉, 변수가 어디에서 선언되고 호출되느냐에 따라 그 의미가 달라집니다.

Javascript 와 프로토타입

전통적인 분류(클래스 기반 접근)는 대상의 본질을 미리 규정하려 하지만, 비트겐슈타인은 단어의 의미는 사용되는 문맥에 의해 결정된다고 보았습니다. 로쉬는 이를 실험적으로 증명하며, 사람들이 대상들을 ‘원형’을 중심으로 등급화하고 분류한다는 점을 밝혀냈습니다.

JavaScript가 프로토타입 기반 상속을 선택한 이유는 여러 역사적, 기술적, 그리고 철학적 배경이 복합적으로 작용한 결과라고 할 수 있습니다. JavaScript는 실행 도중 객체에 속성과 메서드를 자유롭게 추가하거나 수정할 수 있어야 하는 동적 언어로 설계되었습니다. 이러한 특성은 런타임 확장성과 유연성을 요구하며, 프로토타입 체인은 객체들이 자신의 프로퍼티나 메서드를 동적으로 상속받을 수 있게 해줍니다. 이 방식은 메모리 효율성을 높여 공통 기능을 단일 프로토타입 객체에 정의함으로써 여러 인스턴스가 이를 공유하게 만듭니다.

JavaScript는 복잡한 클래스 계층 구조를 사전에 정의하지 않고도 간단하게 객체를 생성하고 관계를 형성할 수 있도록 설계되었습니다. 객체가 일급 시민(first-class citizen)으로 취급되는 언어적 특성과 더불어, 프로토타입 기반 상속은 고정된 ‘정적 분류’보다는 실제 사용되는 사례와 문맥에 따라 유연하게 동작합니다. 이러한 접근법은 비트겐슈타인의 의미사용이론과 가족 유사성 개념과도 맞닿아 있어, 객체의 속성이나 메서드가 미리 정해진 본질에 의존하기보다는 사용되는 환경과 상황에 따라 의미와 역할이 결정된다는 점을 반영합니다.

JavaScript는 Self라는 순수 프로토타입 기반 언어의 영향을 많이 받았습니다. Self에서는 객체 복사를 통한 상속, 즉 위임(delegation) 모델을 사용하였는데, 이러한 모델은 JavaScript가 짧은 시간 내에 설계되어야 했던 당시 빠르고 유연한 방법으로 각광받았습니다. Brendan Eich가 JavaScript를 개발할 때, 복잡한 클래스 구조보다 프로토타입 체인을 통한 간단하고 동적인 상속 모델이 개발 시간 단축과 실험적인 접근에 더욱 적합하다는 판단이 작용했습니다.

이러한 설계 철학은 객체 지향 프로그래밍에서 고정된 본질을 전제로 하는 대신, 객체들 간의 유사성과 위임 메커니즘을 통해 유연하게 상호작용하는 모델을 제시하며, JavaScript가 변화무쌍한 환경에 적합한 언어로 발전하는 데 크게 기여했습니다.

JavaScript 설계 철학에의 반영

동적 상속과 위임(delegation)

  • JavaScript는 클래스 대신 프로토타입 체인을 통해 객체 간 속성과 메서드를 위임(delegation)하는 방식을 채택합니다. 이를 통해 런타임 시 객체를 동적으로 확장하거나 변경할 수 있는 유연성을 제공합니다.

호이스팅, 렉시컬 스코프, 그리고 this

  • 호이스팅: 코드가 로드될 때 선언부가 최상단으로 끌어올려지는 현상은, 실행 컨텍스트 내에서 변수와 함수의 의미가 미리 결정되도록 합니다.

  • 렉시컬 스코프: 변수의 유효 범위가 코드의 물리적 위치에 의해 결정되며, 이는 문맥(context)에 따른 의미 사용을 반영합니다.

  • this: 함수가 호출되는 문맥(즉, 발화하는 객체)에 따라 this의 값이 결정되므로, 고정된 객체가 아니라 호출되는 상황에 따라 달라집니다.

javascript의 이러한 특성들은 모두 ‘문맥에 따라 의미가 결정된다’는 프로토타입 철학의 연장선상에서 이해할 수 있습니다.

맺으며

최신 자바스크립트도 다른 언어들과의 호환성을 높이기 위한 기능들이 꾸준히 추가되고 있습니다. 또 AI가 빠른 속도로 발전하면서, 많은 개발자들이 GitHub Copilot이나 ChatGPT와 같은 도구와 함께 ‘페어 코딩’이 보편화되었습니다.

원하는 기능을 빠르게 구현할 수 있고, 문법적인 부분이나 boilerplate 코드를 신경 쓰지 않아도 되는 편의성이 커졌죠. 그러다 보니 “굳이 근본적인 자바스크립트의 내부 동작 원리까지 깊이 알아야 할 필요가 있을까?”라는 의문도 자연스레 생길 수 있습니다.

하지만 언어의 설계 철학과 동작 방식을 이해하는 것은 단순히 결과물만을 빨리 만드는 것 이상을 의미합니다. 자바스크립트의 이론. 혹은 철학을 제대로 이해할 때 비로소 언어에 최적화된 설계를 할 수 있다고 생각합니다.

0개의 댓글

관련 채용 정보