JavaScript class는 ECMAScript 2015을 통해 소개되었으며, 기존 prototype 기반의 상속 보다 명료하게 사용할 수 있습니다. Class 문법은 새로운 객체지향 상속 모델을 제공하는 것은 아닙니다. JavaScript class는 객체를 생성하고 상속을 다루는데 있어 훨씬 더 단순하고 명확한 문법을 제공합니다.
객체 지향 프로그래밍(영어: Object-Oriented Programming, OOP)은 컴퓨터 프로그래밍의 패러다임 중 하나입니다. 객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 “객체”들의 모임으로 파악하고자 하는 것입니다. 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있습니다.
객체 지향 프로그래밍의 특징은 기본적으로 자료 추상화, 상속, 다형 개념, 동적 바인딩 등이 있으며 추가적으로 다중 상속 등의 특징이 존재 합니다. 객체 지향 프로그래밍은 자료 추상화를 기초로 하여 상속, 다형 개념, 동적 바인딩이 시스템의 복잡성을 제어하기 위해 서로 맞물려 기능하는 것입니다.
클래스 기반 프로그래밍과 프로토타입 기반 프로그래밍은 각각 객체지향 프로그래밍의 한 갈래 입니다.
클래스 기반 프로그래밍
클래스, 클래스 내부의 필드와 메소드, 클래스로 생성한 인스턴스 등의 개념이 있는 우리가 비교적 익숙한 객체지향 프로그래밍 입니다.
프로토타입 기반 프로그래밍
프로토타입 기반 프로그래밍은 객체지향 프로그래밍의 한 형태의 갈래로 클래스가 없고, 클래스 기반 언어에서 상속을 사용하는 것과는 다르게, 객체를 원형(프로토타입)으로 하여 복제의 과정을 통하여 객체의 동작 방식을 다시 사용할 수 있습니다.
자바스크립트는 객체지향 언어(모듈화/다형성/캡슐화/상속 등 객체지향 프로그래밍이 가능한 언어)이긴 한데, 객체지향의 개념을 나타내는 방식으로 우리가 익숙한’클래스’가 아닌, 비교적 생소한 ‘프로토타입’이라는 방식을 택한 언어입니다.
프로토타입
객체의 ‘원형 객체’, ‘프로토타입 객체’ 라는 것을 정의하고, 이 프로토타입 객체를 레퍼런스로 가지고 있는 새로운 객체(클래스의 인스턴스에 해당하는 객체를 생성하는 방식으로 객체지향 프로그래밍을 가능하게 합니다.
객체를 생성하면 프로토타입 객체를 레퍼런스로 가지는 연결고리가 생기는데, 이렇게 연결되는 것을 프로토타입 체인이라고 합니다. 새로운 객체는 프로토타입 객체 안에 있는 메소드를 직접 들고있는 게 아니라, 연결된 프로토타입 객체(프로토타입 체인을 따라가면서 탐색)에 있는 메소드를 참조하여 사용합니다.
‘자바스크립트는 프로토타입 기반의 언어이다’라는 말을 볼 때 자바스크립트는 객체지향 언어이지만 프로토타입 기반의 언어입니다.
프로토타입 기반 언어란 프로토타입 체인을 이용하는 언어를 뜻합니다.
프로토타입 체인이은 객체 생성 시 __proto__, .prototype 등으로 엮여서 만들어지는 chain 입니다.(reference)
프로토타입 체인을 이용하여, 어떤 인스턴스에서 property를 ‘get’ 하려고 할 때 (대괄호나 온점 + 프로퍼티명으로 접근) 해당 프로퍼티를 탐색하는 순서를 결정합니다. (스코프체인처럼)
__proto__: 프로토타입 체인 이라고 하는 연결고리 역할을 합니다.
모든 객체는 __proto__를 가지고 있고, 이 __proto__는 자신의 원형이 되는 프로토타입 객체를 레퍼런스 하고 있습니다.(객체를 생성하는 함수의 prototype 속성을 복사해옵니다-reference 복사)
자바스크립트의 객체는 각각 자신의 프로토타입 속성(__proto__)을 가지고 있는다.
객체에서 어떤 프로퍼티를 접근하면 해당 프로퍼티를 객체의 OwnProperty에서 먼저 찾고, 거기서 없으면 __proto__를, 또 없으면 그 다음 __proto__를… 이렇게 __proto__ === null 이 될 때까지(object의 prototype이 나올 때까지) 프로토타입 체인을 따라가며 계속 탐색하는데, 이 과정에서 프로퍼티의 값을 찾으면 값을 반환하고, 못 찾으면 undefined를 반환합니다.
자바스크립트 클래스 뜯어보기
자바스크립트에서는 덕타이핑, 오리처럼 행동하면 이녀석의 타입은 오리다! 라고 정의를 내립니다.
자바스크립트의 클래스는 언어 자체가 프로토타입을 이용하기 때문에, 실제로 자바스크립트의 클래스는 다른 언어에서 ‘클래스’가 하는 일을 자바스크립트가 가진 ‘프로토타입’을 이용해서 할 수 있게 해놓은 것을 ‘class’ 를 사용하는 언어들과 비슷한 문법을 이용해서 쓸 수 있도록 만들어 둔 것입니다.