나도 개발자로써 자바 스크립터는 웹? 홈페이지 만들때 사용하는
그냥 단순한 언어로 생각했다. 그런 언어 왜 배워야되나?? 시간 아깝다는 생각..
그냥 스크립터 언어라고 생각했던 자바스크립터는 단순한 언어가 아닌
 객체지향언어의 또 다른 형태의 프로토타입 기반  객체지향언어(Prototype-base OOL)이다.
 
일반적인 객체지향언어들은 클래스 기반 언어( Class-based OOL)들이다. C++, JAVA, RUBY, SMALLTALK...
그리고 객체지향 언어가 무엇이냐고 물으신다면~ 대부분 클래스 기반 언어들을
생각하면서.. 객체지향언어는 클래스, 객체, 그리고 클래스와 객체의 차이점을
말할것이다.
 
객체지향 프로그래밍의 정의는 실세계를 표방한 프로그래밍 방식이다.
옜날에 철학자 아리스토 텔레스??라는 분이 세상을 분류하는
작업을 했다고 한다.  가령은 어떤 어떤 특징들이 있으면 이건 동물,
동물중에서 두다리 걸고, 지능 쪼매 있고 하면 인간 ..  이런 방식으로
세상을 보려는 시도를 했던 것이다.
이런 사고가 클래스 기반 객체 지향 언어이다. java와 같은 언어에서 프로그래밍
하기 전에 열나게 클래스 정의를 할것이다. 이 작업은
나의 프로그램에서 나타나게 될 객체에 대한 분류작업인것이다.
 
시간이 지나간에 따라 이관점에 대해서 불만(?), 이의를 제기 한 철학자들이
나타났다. 분류하는 기준자체가 항상 객관적일수 없고 또 어떤 사물은
한 클래스에만 포함되지 않는 경우가 발생했다. 그에 대한 대안으로
프로토타입 관점이 대두 되었다. 항상 어떤 것의 포로토 타입이 있고
그것은 시간에 변함에 따라서 진화 또는 퇴화 될수 있다는 개념인것이다.
즉 Prototype이라는것은 사전에 찾아보면 원형이라는 말이다.
이 방식이 그대로 프로그래밍 언어에 적용되었고 그런 언어들을
프로토 타입 객체지향언어이다.
요약하자면 클래스기반은 추상화(Abstract) 관점을 취하고 포로토 타입은 상세화(concrete)한관점을
취한다고 할까나? 세상을 보는 파악하는 순서가 정반대인 셈이다.
추상화된 개념을 만들려고 시도 하는 방식과  유형의 것을 찾으려고 하는  방식.
 
 
그럼 클래스 기반과 프로토타입의 기반 차이점은 무엇일까?
첫째는 딱 알수 있듯이 프로토 타입에는.. 객체를 추상화 하는
클래스라는게 없다. 단지 프로토 타입만 존재하고 그것으로부터
객체가 생성된다.  프로토타입도 또한 객체인것이다.
클래스 기반의 객체는 생성되어지면 그 객체의 클래스의 속성을
그대로 받게 되고 나중에 변화되거나 삭제할수 없다. 그러나
포로토 타입의 객체는 다르다. 런타임에 속성를 추가할수 있고.. 삭제할수 있다.
이게 진화한거나 퇴화한다는 의미인것 같다.^^;;
그럼 상속은 어떻게 했을까?? 클래스 기반은 처음에 클래스를 정의할때
상속의 관계를 명시하게 된다. 그러나 프로토 타입은 클래스가 없으니
그렇게 할수는 없고 객체간의 클론(clone) 이용해서 상속을 표현하였다.
자바스크립터를 예를 들면 상속받고자 하는 객체는 상속하고자 하는 객체의
포르토타입이라는 필드에 객체를 그대로 복사하게 된다. 이처럼 런타임에
두객체사이에 연결고리를 만들게 된다.
 
위에서 설명한것 처럼 자바스크립터는 프로토타입기반 객체지향언어이다.
객체생성은 함수를 통해서 바로 생성되고 상속은 위에서 말한것 처럼
상속하고 자하는 객체를 포로토타입이라는 필드에 그 객체를 생성해 치환하면된다.
솔직히 이런 기능들을 사용하는 일은 극히 드문일이다. 자바스크립터 소스를
보면 객체 생성하는 예는 본적이 없고, 단지 생성되어져 있는 객체를 사용할뿐이다.
자바스크립터 언어는 우리 쉽게 접할수있는 유일한 포로토타입 객체지향언어이다.
각각의 언어 패러다임을 이해하는것은 언어를 사용할때 중요한 일이라고 생각된다.
그 언어가 어떤 패러다임을 가지는지를 알면 그 언어의 전체적인 흐름을 이해할수 있기때문이다.
 
프로토타입에 대한 나의 짧은 이해...
[출처] [펌] JavaScript도 객체지향언어이다.|작성자 안드레아