자바스크립트의 큰 특징 중 하나는 프로토타입 기반 언어라는 것이다.

하지만 프로토타입은 무엇이고, 자바스크립트에서 프로토타입이 왜 필요한가? 라는 질문에 대답하려면, 말문이 턱하고 막히는 경험을 하게 된다. 이에 대해 설명해보고자 이 글을 작성하게 되었다.

왜 자바스크립트가 프로토타입이라는 개념을 사용하게 되었는지 프로토타입의 목적과 의도를 알아보자.

배경

자바스크립트는 1995년 Netscape에서 BrendanEich에 의해 개발된 언어로 웹 브라우저에서 가볍게 동작하는 스크립팅 언어를 만들기 위해 단기간 내에 제작 되었다. 개발 기간이 약 10일이라는 내용은 아주 유명하다

클래스 정의 없이 직접 객체를 생성literal object하고 필요에 따라 동적으로 속성과 메서드를 추가하거나 수정할 수 있기에 매우 위험하지만서도 그만큼 초보자가 쉽게 접근할 수 있도록 설계된 것이다. 자바스크립트는 Self 라는 언어에서 영감을 받아 제작되었다.

Self

Self는 프로토타입 기반 객체지향 언어로 객체가 다른 객체를 복제하거나 프로토타입을 참조하여 동적으로 행동을 정의하는 것이 특징이다. 클래스 없이 객체 중심으로 동작하며 클로닝cloning과 동적슬롯dynamic slot을 통해 상속과 재사용을 구현했다. self의 동적이고 단순한 설계 방식이 자바스크립트에 영향을 끼치긴 했지만 자바스크립트는 웹환경에 맞게 간소화 된 형태로 개발되었다. https://selflanguage.org/

이 언어는 연구 언어로 남아있다. 1995년, 당시 언어 경쟁 프로젝트에서 Java가 웹 브라우저 내 실행 가능한 콘텐츠를 시연하며 승자로 선정되었고 self 언어에 대한 지원이 중단되었다.

그렇다면 이 언어는 왜 등장한 것일까? 이에 대한 내용은 논문(Classes vs Prototype Some Philosophical and Historical Observations)을 통해서 알 수 있었다.

프로토타입 기반 언어의 등장

“Objects in the real world have only one thing in common —they are all different.”

클래스 기반 시스템과 프로토타입 기반 시스템의 구분은 추상화에 대한 철학적 사고의 차이에서 시작되었다.

클래스 기반 시스템은 플라톤의 형태론forms기반(한가지 형태, 이데아Idea중심 사고)으로 그의 제자 아리스토텔레스가 제시한 분류 체계Classification에 초점을 맞춘 시스템이다. 여러 객체들이 동일한 범주에 속하려면 동일한 속성을 가져야 한다는 분류체계에 따라, 클래스 기반 시스템의 클래스class는 슈퍼클래스(공통속성genus)과 추가변수/메서드 집합(구분differentia)을 통해 정의되었다.

하지만 한편, 이 분류학에 대한 비판이 생겨났다.

전통적 분류학은 카테고리가 명확하고 경계가 존재하며 공유 속성을 가정하고 있지만, 실제로는 이 경계와 속성이 모호하다는 것이다. 이는 비트겐슈타인의 가족유사성family resemblances개념으로부터 시작된다. 카테고리라는 것은 명확한 공유 속성이 아닌 유사성에 기반하여 형성된다는 것이다. 이는 유연하고 주관적인 분류 방식을 강조하는데 이에 기인한 프로토타입 기반 언어들은 클래스를 없애고, 객체를 복제/수정함으로써 유연한 설계와 동적인 상속을 지원하였다. 이것이 인간의 인지방식에 더 부합하다고 생각한 것이다.

프로토타입 기반언어의 특징

가족유사성은 전통적인 방식의 분류학 중심의 객체 지향 설계방식과 완전히 상반된다. 비트겐슈타인은 가족유사성을 “중복되고 교차하는 유사성들의 복잡한 연결망”이라 표현했다. 게임예시를 통해 하나의 단일한 본질이 있음을 부정하고, 부분적으로 겹치고 중첩되는 가족유사성을 통해서만 하나의 이름으로 표현될 수 있다고 주장했다.

이러한 가족유사성에 기반한 프로토타입 기반 객체 지향 언어의 특징은 다음과 같이 요약할 수 있다.