3.9.3 클래스냐 프로토타입이냐
객체에 액세스하는 방법은 클래스(class)12와 프로토타입(prototype)13 두 가지다. 클래스가 먼저 나왔고, C++, 자바, C# 같은 친구들 덕분에 유명해졌다. 프로토타입은 자바스크립트가 우연히 세상을 점령하기 전까지 거의 잊힌 가지였다.
클래스 기반 언어에는 인스턴스(instance)와 클래스(class)라는 두 가지 코어 개념이 있다. 인스턴스는 각 객체의 상태를 저장하며 인스턴스의 클래스를 가리키는 참조를 갖고 있다. 클래스에는 메서드와 상속 체인(inheritance chain)이 들어 있다. 인스턴스에 있는 메서드를 호출하면 언제나 간접 참조(indirection)가 일어난다. 즉, 인스턴스의 클래스를 찾은 다음, 거기에서 다시 메서드를 찾는다.
C++ 같은 정적 타입 언어에서 메서드 조회는 대개 인스턴스의 정적 타입을 기반으로 컴파일 타임에 발생한다. 즉, 정적 디스패치(static dispatch)를 한다. 이와 반대로 동적 디스패치(dynamic dispatch)는 런타임에 실제 인스턴스 객체의 클래스를 조회한다. 정적 타입 언어의 가상 메서드(virtual method)와 록스 같은 동적 타입 언어의 모든 메서드는 바로 동적 디스패치 방식으로 작동된다.
사실, 클래스 기반 언어와 프로토타입 기반 언어는 경계가 모호하다. 자바스크립트의 '생성자 함수(constructor function)'는 클래스와 비슷한 객체를 정의하는 방향으로 일을 복잡하게 꼰다.14 한편, 클래스 기반 언어인 루비는 인스턴스마다 메서드를 붙일 수 있게 허용하므로 행복하다!