Javascript

모던 자바스크립트 Deep Dive 읽기 - 25장 : 클래스

띵킹 2022. 4. 7. 18:41

자바스크립트는 프로토타입 기반 객체지향 언어이다. 프로토타입 기반 객체지향 언어는 클래스가 필요 없는 객체지향 프로그래밍 언어다. 생성자 함수와 프로토타입을 통해 객체지향 언어의 상속을 구현할 수 있다. 그러나 클래스 기반 언어에 익숙한 프로그래머들은 프로토타입 기반 프로그래밍 언어에 혼란을 느낀다. ES6에 도입된 클래스는 그러한 배경을 통해 등장하였다. 

 

클래스와 생성자 함수는 모드 프로토타입 기반의 인스턴스를 생성하지만 정확히 동일하게 동작하지는 않는다. 클래스는 생성자 함수보다 엄격하며, 생성자 함수에서는 제공하지 않는 기능도 제공한다. 

클래스는 생성자 함수와 매우 유사하게 동작하지만, 다음과 같이 몇 가지 차이가 있다. 

1. 클래스를 new 연산자 없이 호출하면 에러가 발생한다.

2. 클래스는 상속을 지원하는 extends와 super 키워드를 제공한다. 

3. 클래스는 호이스팅이 발생하지 않는 것처럼 동작한다.

4. 클래스 내의 모든 코드에는 암묵적으로 strict mode가 지정되어 실행된다. 

5. 클래스의 constructor, 프로토타입 메서드, 정적 메서드는 열거할 수 없다. 

 

클래스는 class 키워드를 통해 정의하며, 함수와 마찬가지로 일급 객체와 같은 특징을 가진다. 

클래스는 생성자 함수이며 new 연산자와 함께 호출되어 인스턴스를 생성한다.

클래스 몸체에는 0개 이상의 메서드만 선언할 수 있다. 클래스 몸체에서 정의할 수 있는 메서드는 생성자, 프로토타입 메서드, 정적 메서드의 세 가지가 있다. 

클래스에서 정의한 메서드는 function 키워드를 생략한 메서드 축약 표현을 사용한다. 그리고 객체 리터럴과 다르게 메서드를 정의할 때 콤마가 필요 없다. 암묵적으로 strict mode로 실행되며, 열거할 수 없다. 

 

클래스는 상속에 의해 확장할 수 있다. extends 키워드를 사용하면 다른 클래스를 상속받을 수 있다. 

super 키워드는 함수처럼 호출할 수도 있고, this와 같이 식별자처럼 참조할 수 있는 특수한 키워드이다. 

super를 호출하면 상위클래스의 constructor를 호출한다. super를 호출할 때 주의할 사항은 다음과 같다 

 

서브클래스에서 constructor를 생략하지 않는 경우 서브클래스의 constructor에서는 반드시 super를 호출해야 한다. 서브클래스의 constructor에서 super를 호출하기 전까지는 this를 참조할 수 없다. super는 반드시 서브클래스의 constructor에서만 호출한다. 

728x90