[JavaScript] 철학적인 클래스와 프로토타입

JIIJIIJ·2024년 3월 8일
0

JavaScript

목록 보기
19/23
post-thumbnail

자바스크립트를 공부하다 보면 클래스, 프로토타입, this, 호이스팅, 실행 컨텍스트 같은 낯설고 복잡한 개념들을 접하게 됩니다.
대부분의 자료는 이러한 개념들의 사용법과 중요성만 설명할 뿐, 왜 이런 개념이 필요했는지에 대해서는 다루지 않습니다.

그래서 “왜?“라는 질문이 자연스럽게 따라옵니다.
이를 해결하기 위해 여러 글을 읽던 중, 자바스크립트는 왜 프로토타입을 선택했을까라는 글을 통해 이 궁금증을 해결할 수 있었습니다.

아래는 그 글을 기반으로 제가 이해한 내용을 정리한 것입니다.

플라톤의 이데아와 클래스

이데아 개념

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

이데아란, 플라톤의 철학에 따르면, 완벽한 본질 혹은 이상적인 형태를 뜻합니다.
우리 주변의 모든 사물은 이 이데아를 모방한 것에 불과하다는 것입니다.

예를 들어, 우리가 “사람”이라는 개념을 이해할 수 있는 이유는 이데아 속에 “사람”이라는 완벽한 형태가 존재하기 때문입니다.
개별적인 사람(예: 홍길동)은 이데아 속의 본질적인 “사람”을 모방한 존재라고 볼 수 있습니다.

클래스(Class)란 무엇인가?

class Person {
    // ...
}
Person hong = new Person();

위 코드에서 Person은 추상적인 개념으로, 현실에서는 존재하지 않지만 객체를 생성하기 위한 청사진입니다.
hong은 이 클래스를 기반으로 만들어진 구체적인 인스턴스입니다.

이를 철학적으로 비유하면:
• 클래스: 이데아 속의 “사람”이라는 완벽한 형태
• 인스턴스: 이데아를 모방하여 만들어진 구체적인 객체(예: 홍길동)

이처럼 클래스 기반의 객체지향 프로그래밍 언어(Java, C++, C# 등)는 플라톤의 철학에 뿌리를 두고 있다고 볼 수 있습니다.

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

클래스의 개념은 플라톤의 제자인 아리스토텔레스의 분류법(Classification)에서도 찾아볼 수 있습니다.
아리스토텔레스는 세상을 공통된 속성에 따라 분류함으로써 개체를 이해하고 구별하려 했습니다.

예시: 사람의 분류
• “사람”이라는 그룹은 이성, 언어 사용, 직립 보행이라는 공통 속성을 가진 개체들로 구성됩니다.
• 이렇게 정의된 “사람” 그룹을 통해, 우리는 “사람”과 “동물”을 구별할 수 있습니다.

클래스와 분류법의 연관성

프로그래밍에서 클래스는 아리스토텔레스의 분류법을 구현한 도구라고 볼 수 있습니다.
• class Person은 이름, 나이, 성별 등의 공통된 속성을 가진 사람 객체들을 정의하는 도구입니다.
• 이를 통해 우리는 현실 세계의 문제를 체계적으로 해결할 수 있습니다.

한계: 분류의 어려움

속성만으로 개체를 분류하는 방식은 때로 모호한 결과를 초래합니다.
• 돌고래는 물속에 살지만 어류가 아닌 포유류입니다.
• 박쥐는 날개가 있지만 조류가 아닌 포유류입니다.

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

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

비트겐슈타인의 반박

20세기의 철학자 비트겐슈타인은 아리스토텔레스의 고정된 분류법을 반박하며, 맥락과 유사성의 중요성을 강조했습니다.

1. 의미사용이론

언어의 의미는 사용되는 맥락에 따라 달라진다는 이론입니다.
예를 들어:

  • 화가는 “물”을 수채화를 위한 재료로 이해합니다.
  • 목이 마른 사람은 “물”을 생수로 이해합니다.

2. 가족유사성 이론

비트겐슈타인은 특정 그룹의 개체들이 명확한 공통점 없이도 유사성을 통해 하나의 범주를 형성할 수 있다고 주장했습니다.
예를 들어:

  • “게임”이라는 단어는 축구, 바둑, 컴퓨터 게임 등 다양한 사례를 포함하지만, 명확한 공통 속성을 찾기는 어렵습니다.

프로토타입 이론과 자바스크립트

프로토타입 이론의 개념

비트겐슈타인의 이론은 인지과학자 로쉬(Eleanor Rosch)의 프로토타입 이론으로 발전했습니다.
프로토타입 이론은 특정 그룹을 가장 잘 대표하는 표준적인 사례(프로토타입)를 중심으로 그룹을 이해하는 방식을 제시합니다.

예를 들어:

  • “새”라는 그룹에서는 참새가 프로토타입이 될 가능성이 큽니다.
  • 펭귄이나 타조는 “새”라는 범주에 속하지만 프로토타입으로는 부적합합니다.

자바스크립트와 프로토타입

자바스크립트의 프로토타입은 이 이론을 구현한 것으로, 객체가 프로토타입 객체를 통해 속성과 메소드를 상속받는 구조입니다.

  • 문맥(Context) 기반 평가
    프로토타입은 맥락에 따라 객체의 속성과 메소드를 평가하는 유연한 구조를 제공합니다.

프로토타입 기반 객체지향 프로그래밍의 특징

프로토타입 기반 언어(JavaScript 등)는 클래스 기반 언어와 다르게 개체 중심의 설계를 지원합니다.

  1. 개별 객체 수준에서 메소드와 변수를 추가할 수 있음.
  2. 객체 생성은 복사를 통해 이루어짐.
  3. 확장은 클래스가 아닌 위임(Delegation)을 통해 이루어짐.
  4. 객체의 유사성을 바탕으로 설계하며, 분류보다는 맥락을 중시.

정리

  • 프로토타입 언어에서는 ‘분류’를 우선하지 않습니다.
    대신, 생성된 객체를 중심으로 유사성을 정의합니다.
  • 어휘와 쓰임새는 맥락(context)에 따라 평가됩니다.

자바스크립트의 중요한 개념인 실행 컨텍스트, 스코프 체인, 클로저, this, 호이스팅 등은 모두 이 맥락(Context)을 표현하기 위한 도구입니다.

프로그래밍 언어를 배우는 것은 단순히 문법과 함수를 외우는 것이 아니라, 그 기능들이 왜 존재하는지를 이해하는 과정입니다.
이를 통해 언어의 본질을 이해하고, 더 효과적으로 활용할 수 있게 됩니다.

특히, 자바스크립트처럼 프로토타입 기반 객체지향 언어는 그 철학적 기원을 이해함으로써 더 깊은 이해와 활용이 가능합니다.
“왜?“라는 질문을 두려워하지 말고, 이를 학습의 도구로 삼아 한 단계 더 깊이 공부하는 기회로 삼으면 좋겠습니다.

profile
다크모드가 보기 좋아요

0개의 댓글