클래스는 특정 자료 구조를 분류하는 용도로 사용됩니다.
예를 들면, Vehicle 클래스와 Car 클래스는 서로 상속관계로서, Vehicle은 엔진 등의 추진 기관과 사람 등을 운송하는 기능을 함께 정의합니다. Car는 Vehicle의 기반 정의를 상속 받아 정의하여 세분화한 것입니다.
그렇다면 자바스크립트 (이하 JS)에는 클래스가 존재할까요? 단도직입으로 말해서 아닙니다.
많은 개발자들이 적어도 외관상으로는 클래스처럼 생긴 구문을 제공하여 클래스 디자인 패턴을 실현하려는 욕구를 충족시키고자 많은 노력을 거듭해왔습니다.
그 결과로 현재는 아예 class라는 예약어까지 생겨났습니다. 하지만 이는 클래스처럼 보이는 구문일 뿐이며 개발자들이 클래스 디자인 패턴으로 코딩할 수 있도록 JS 체계를 억지로 뜯어 고친 것에 불과합니다.
그러면, 잠깐 클래스에 대해서 설명하겠습니다.
자료구조 하면 흔히 떠오르는 것 중 하나인 Stack은 Stack 클래스에 구현해놓았습니다. Stack 클래스 내부에는 데이터와 외부에서 접근 가능한 메서드를 제공합니다. 하지만, Stack 클래스 자체에서 어떤 작업을 수행할 수 있는 것은 아닙니다. Stack 클래스는 모든 Stack이라면 마땅히 해야 할 기능들을 추상화해놓은 것이지 그 자체가 Stack은 아닙니다. Stack 클래스를 인스턴스화해야 비로소 작업을 수행할 구체적인 자료 구조가 마련되는 것입니다.
이 인스턴스는 객체로서 클래스에 기술된 모든 특성을 그대로 가진 사본입니다. 클래스는 복사 과정을 거쳐 객체 형태로 인스턴스화하는 것입니다. 그리고 새로운 인스턴스를 생성할 거라는 신호를 JS 엔진이 인지할 수 있도록 항상 new 키워드를 앞에 붙여 생성자를 호출합니다.
클래스 지향 언어에서는 인스턴스화할 수 있는 클래스를 '부모 클래스', 상속받은 클래스를 '자식 클래스' 라고 통칭합니다. 자식 클래스는 부모 클래스에서 완전히 떨어진 별개의 클래스로 정의됩니다. 부모로부터 복사된 초기 버전의 작동을 고스란히 간직하고 있지만 물려받은 작동을 전혀 새로운 방식으로 재정의 (오버라이드)할 수 있습니다.
클래스를 상속하면 자식 클래스에는 자신의 부모 클래스를 가리키는 상대적인 레퍼런스가 주어지는데, 이 레퍼런스가 바로 super입니다.
자식이 부모에게 상속받은 메서드를 오버라이드하면 원본 메서드와 오버라이드된 메서드는 각자의 길을 걷게 되며 양쪽 다 개별적으로 접근할 수 있습니다. 클래스 상속은 한 마디로 복사입니다.
JS에서 클래스는 객체 간 사본으로 자동으로 생성하지 않습니다. 즉, 복사하지 않고 그저 기존의 객체를 새로 만드려는 객체와 연결시킵니다.