Search Results for '프로토타입'

2 POSTS

  1. 2006.12.25 Prototyped-based Programming 3
  2. 2006.10.12 클래스 기반 & 프로토타입 기반 객체 지향 언어 1

Prototyped-based Programming

Posted 2006. 12. 25. 20:02
우리가 객체지향 프로그래밍 언어(object-oriented programming language)라고 부르는 언어 패러다임은 크게 1) 클래스 기반과 2) 프로토타입 기반의 언어로 양분할 수 있습니다. 클래스 기반 객체지향언어는 C++, 스몰토크, 자바, 루비처럼 클래스를 통해 현실 세계를 모델링하고, 클래스에서 객체(인스턴스)를 찍어내서 프로그래밍하는 모델을 말합니다. 반대로 프로토타입 기반의 언어에는 자바스크립트(JavaScript)가 있는데, 별도의 클래스 없이 이미 존재하는 객체를 클론(clone)해서 프로그램을 작성하는 방법입니다.

프로토타입 기반 언어에 대한 일반적인 비판은 동적 타이핑 언어에 대한 비판과 닮아 있습니다. 정확성(correctness), 안전성(safety), 예측성(predictability), 효율성(efficiency) 등이 떨어진다는 것입니다. [위키피디아 참고] 클래스 기반 객체지향언어에서 클래스는 외부 세계를 모델링(modeling)하는 방법일 뿐만 아니라 프로그램의 정확성을 확인할 수 있는 타입(type)이기 때문입니다. 쉽게 풀어서, 루비의 Array 클래스가 sort라는 메쏘드를 가지고 있다는 사실 자체가 클래스 사용자와 클래스 사이의 계약이 되기 때문입니다. 반대로 프로토타입 기반 언어에서는 클래스가 없기 때문에 이런 계약 관계를 쉽게 알아보기 힘들게 됩니다.

빠른 프로토타이핑(prototyping)과 개발 속도를 위해서 정적 타입 시스템(static type system)이라는 안전망을 포기한 스크립트 언어가 대부분 클래스기반 객체지향언어라는 점은 약간 의아합니다. 상업적으로 유일하게 성공한 프로토타입 언어인 자바스크립트를 제외하면, 프로토타입 언어는 Self, Cecil, Io 등 연구용 언어가 대부분이기 때문입니다. 자바스크립트의 표준인 EcmaScript조차 클래스 기반 언어로 전환을 이야기하고 있다고 합니다.

저는 개인적으로 파이썬 루비 같은 범용적 스크립트 언어면서 프로토타입에 기반한 언어가 대두하지 않을까 하는 생각을 해보기도 합니다. 동적 타이핑(dynamic typing)이라고 하지만 실제로는 타입 시스템이 없는 것이나 마찬가지인 스크립트 언어에서 굳이 클래스 기반 언어를 고집할 이유가 없기 때문입니다. 물론 객체지향 모델링 방법이나 베스트 프랙티스 등이 모두 클래스 기반 언어를 중심으로 논의되어 왔고, 기존 개발자들이 프로토타입 기반 객체지향 언어에 익숙하지 않다는 문제점이 있기는 합니다. 하지만 현재의 스크립트스러움을 극단으로 몰고 가려면 클래스 보다는 오히려 프로토타입이 아닐까요?
예전에 KLDP에 Io Language를 언급하면서 프로토타입 기반의 객체지향(OO) 언어에 대한 질문이 올라온 적이 있었습니다.

여기에 대해 설명을 달았었는데, 다시 정리하자면 객체 지향(Object-Oriented)을 프로그래밍 언어로 구현하는 방법에는 크게 두 가지 큰 줄기가 있습니다. 첫 번째가 C++, 자바, C# 등이 공통적으로 쓰고 있는 클래스 기반의 객체지향 언어이고, 또 다른 방식으로 자바 스크립트나 Io 언어 등이 사용하는 프로토타입 방식의 객체 지향 언어가 있습니다.

클래스 기반 OO의 경우 클래스가 객체를 찍어내는 틀 역할을 합니다. 객체는 클래스라는 틀에서 붕어빵을 찍듯이 하나씩 찍어내는 개념이죠. C++, 자바 등에 익숙한 사람이라면 new 연산자를 이용해서 클래스로부터 객체를 생성하는 과정을 이해하실 겁니다.

반면에 프로토타입 기반의 언어는 이런 개념을 차용하지 않았습니다. 클래스라는 틀의 존재를 상정치 않고(classless object model이라고도 불립니다), 곧바로 시스템에 여러 종류의 객체가 존재하게 됩니다. 프로토타입 기반의 객체 지향 언어는 이렇게 이미 존재하는 객체를 직접 사용하거나, 클론(clone)해서 사용합니다. 필요에 따라 클론한 객체에 추가적인 기능을 구현(일종의 inheritance)을 하기도 합니다.

현재는 클래스 기반의 OO가 대세이기 때문에 "객체 지향 = 클래스 기반"이라는 등식이 생겼지만, 실제로는 프로토타입 기반의 OO도 여러 언어에서 사용되고 있습니다. 현재 개발자들에게 가장 익숙한 프로토타입 OO 언어는 아마 JavaScript일 것입니다.

University of Washington의 Washington Advanced Systems for Programming에 있는 Craig Chambers 교수가 연구했던 프로토타입 기반 객체 지향 언어인 Cecil 프로젝트를 보시면, 프로토타입 기반 OO로 우리가 알고 있는 OO의 기본 개념들을 어떻게 구현하는지 힌트를 얻을 수 있으실 겁니다. 다만 현재 국내 개발자들 사이에서 인지도가 높은 Io 언어는 어떤 차별성이 있는지 잘 모르겠네요.