클래스와 일급 객체
클래스는 새로운 객체 생성 메커니즘이며, 자바스크립트에서 일급 객체로 취급된다.
일급 객체로서 클래스가 갖는 특징은 다음과 같다:
런타임에 생성 가능
변수나 자료구조에 저장 가능
함수의 매개변수로 전달 가능
함수의 반환값으로 사용 가능
예시:
function createClass() {
return class {};
}
const DynamicClass = createClass();
클래스 vs 생성자 함수
클래스 생성자 함수
호출 방식 |
|
|
상속 지원 |
| X |
호이스팅 | let/const처럼 TDZ 적용 | 선언문 → 함수 호이스팅, 표현식 → 변수 호이스팅 |
strict mode | 암묵적 적용 | 기본 X |
메서드 열거 |
| 기본 열거 가능 |
클래스 호이스팅
클래스 선언문도 함수처럼 호이스팅되지만, TDZ(Temporal Dead Zone) 때문에 선언 전에 참조할 수 없다.
const a = new MyClass(); // ReferenceError
class MyClass {}
인스턴스 생성
클래스는 반드시 new 연산자와 함께 호출해야 한다.
class Person {}
const p = new Person(); // OK
Person(); // TypeError
클래스 메서드
1. constructor
인스턴스를 생성하고 초기화하는 특별한 메서드
클래스 내 최대 한 개만 정의 가능
생략 시 빈 constructor가 암묵적으로 정의됨
return문은 생략해야 함 (this 반환이 기본)
class Person {
constructor(name) {
this.name = name;
}
}
2. 프로토타입 메서드
모든 인스턴스가 공유하는 메서드
class Person {
sayHi() {
console.log(`Hi, I'm ${this.name}`);
}
}
3. 정적 메서드
인스턴스를 생성하지 않아도 호출 가능
인스턴스가 아닌 클래스 이름으로 호출해야 함
class MathUtil {
static add(a, b) {
return a + b;
}
}
MathUtil.add(2, 3); // 5
정적 메서드 vs 프로토타입 메서드
정적 메서드 프로토타입 메서드
호출 주체 | 클래스 | 인스턴스 |
인스턴스 프로퍼티 접근 | 불가 | 가능 |
프로토타입 체인 | 클래스 함수 객체에 존재 | 인스턴스의 프로토타입에 존재 |
정적 메서드를 네임스페이스처럼 모아두면:
이름 충돌 방지
관련 함수 구조화
전역 유틸 함수 관리에 유리
클래스 메서드의 특징
function키워드 생략 (메서드 축약 표현)메서드 사이에
,필요 없음암묵적 strict mode
for...in, Object.keys로 열거 불가
new 연산자로 호출 불가
클래스 상속
기존 클래스를 extends 키워드로 확장할 수 있다.
슈퍼클래스(superclass): 상속을 제공하는 클래스
서브클래스(subclass): 상속을 받는 클래스
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a noise.`);
}
}
class Dog extends Animal {
constructor(name) {
super(name); // 반드시 super 호출
}
speak() {
console.log(`${this.name} barks.`);
}
}
const d = new Dog("Max");
d.speak(); // Max barks.
super 동작
super()호출 → 슈퍼클래스의 constructor 실행메서드 안에서
super.method()호출 → 슈퍼클래스의 메서드 참조
서브클래스의 constructor에서 super()를 반드시 호출해야 하는 이유:
인스턴스 생성 책임을 슈퍼클래스에 위임
this 바인딩과 초기화 과정이 선행되어야 함
자바스크립트의 클래스는 사실상 생성자 함수와 프로토타입 기반 객체 생성 방식을 문법적으로 더 직관적으로 표현한 것이라 보면 된다.