📑 목차
자바스크립트(ES6)의 클래스 문법에 타입스크립트만의 타입 시스템이 더해지면 어떻게 될까? 필드 선언부터 상속 시 주의할 점까지, 타입스크립트에서의 클래스 사용법을 정리해 본다.
1. 클래스 필드 선언
타입스크립트에서 클래스를 만들 때는 필드(Field) 를 선언할 때 반드시 타입을 함께 정의해야 한다.
class Employee {
// 필드
name: string = "";
age: number = 0;
position: string = "";
// 메서드
work() {
console.log("일함");
}
}
주의할 점
- 타입 주석 필수: 타입을 정의하지 않으면 암시적
any타입으로 추론된다.strict모드(엄격한 타입 검사)에서는 이것이 오류로 간주된다. - 초기값 설정: 생성자(
constructor)에서 값을 초기화하지 않는다면, 필드 선언 시 기본값을 할당해 줘야 한다. 그렇지 않으면 "초기화되지 않았다"는 오류가 발생한다.
2. 생성자(Constructor)와 선택적 프로퍼티
생성자를 이용해 인스턴스 생성 시점에 필드 값을 초기화할 수 있다. 생성자에서 할당이 확실하게 이루어진다면, 필드 선언부에서 초기값을 생략해도 된다.
class Employee {
// 필드
name: string;
age: number;
position: string;
// 생성자
constructor(name: string, age: number, position: string) {
this.name = name;
this.age = age;
this.position = position;
}
work() {
console.log("일함");
}
}
선택적 프로퍼티 (Optional Property)
특정 필드가 있어도 되고 없어도 되는 경우라면, 필드 이름 뒤에 물음표(?)를 붙여 선택적 프로퍼티로 만들 수 있다.
class Employee {
// ...
position?: string; // 선택적 프로퍼티
constructor(name: string, age: number, position: string) {
// ...
this.position = position;
}
}
3. 클래스는 타입이다
타입스크립트의 클래스는 값이자 동시에 타입으로도 사용된다. 즉, 클래스로 만든 인스턴스뿐만 아니라, 그 클래스의 형태(구조)를 가진 객체라면 해당 클래스 타입으로 정의할 수 있다.
class Employee {
// ... (위와 동일)
}
// Employee 클래스를 타입으로 사용
const employeeC: Employee = {
name: "조태민",
age: 25,
position: "Developer",
work() {
console.log("일하는 중");
},
};
변수 employeeC는 Employee 클래스의 인스턴스(new Employee(...))가 아니지만, Employee가 가진 필드와 메서드를 모두 가지고 있으므로 Employee 타입으로 인정된다. (구조적 타이핑)
4. 상속 (Inheritance)
extends 키워드를 사용해 클래스를 상속받을 수 있다. 이때 생성자(constructor)를 다룰 때 주의해야 할 규칙이 있다.
// Employee를 상속받는 ExecutiveOfficer 클래스
class ExecutiveOfficer extends Employee {
officeNumber: number;
constructor(
name: string,
age: number,
position: string,
officeNumber: number
) {
super(name, age, position); // ✅ 반드시 최상단에서 호출!
this.officeNumber = officeNumber;
}
}
상속 시 주의사항 (super)
파생 클래스(자식)에서 생성자를 정의했다면, 반드시 super() 메서드를 호출해 부모 클래스의 생성자를 실행해야 한다.
또한 super() 호출은 this에 접근하기 전, 생성자 내부의 최상단에 위치해야 한다.
요약
- 필드 선언: 필드의 타입과 초기값을 명시해야 안전하다.
- 생성자: 필드 초기화의 역할을 하며,
?를 써서 선택적 필드를 만들 수 있다. - 타입으로서의 클래스: 클래스 이름은 그 자체로 타입으로 사용될 수 있다.
- 상속:
extends를 사용하며, 자식 클래스 생성자에서는super()를 가장 먼저 호출해야 한다.
