기본적으로 자바스크립트 클래스 개념을 따라갑니다. 자바스크립트 클래스는 이 포스트를 참조해주세요.
타입스크립트에서 클래스
는 자바스크립트와 동일하게 선언되지만 클래스 프로퍼티들에게 타입을 정의해주어야합니다. 타입을 정의하지 않을 경우 암시적 any 타입으로 정의하게 됩니다.
class Student {
name: string;
grade: number;
constructor(name: string, grade: number) {
this.name = name;
this.grade = grade;
}
printInfo() {
console.log(`이름: ${name}, 학년: ${grade}`);
}
}
타입스크립트에서 클래스
는 타입처럼 사용이 가능합니다.
타입으로 사용할 경우 인스턴스화한 객체의 타입과 동일한 타입으로 취급됩니다.
class Student {
name: string;
grade: number;
constructor(name: string, grade: number) {
this.name = name;
this.grade = grade;
}
printInfo() {
console.log(`이름: ${name}, 학년: ${grade}`);
}
}
const student: Student = {
(...)
}
이때의 student 객체는 name, grade, printInfo()
를 갖는 객체 타입으로 취급됩니다.
상속도 자바스크립트와 동일하게 수행됩니다.
class Student {
name: string;
grade: number;
constructor(name: string, grade: number) {
this.name = name;
this.grade = grade;
}
printInfo() {
console.log(`이름: ${name}, 학년: ${grade}`);
}
}
class Freshman extends Student {
major: string;
constructor(name: string, grade: number, major: string) {
super(name, grade);
this.major = major;
}
}
자바스크립트에서 접근 제어자는 암묵적으로 약속된 키워드(_)를 사용하거나 ES10에서 추가된 #
을 사용해 private
를 표현하는 정도였습니다.
하지만 타입스크립트에선 클래스를 위한 접근 제어자 키워드 public, protected, private
를 제공하고 있습니다.
각 접근제어자에 대한 접근 가능 범위는 다음과 같습니다.
접근 제어자는 타입 정의한 클래스 프로퍼티 앞에 붙여서 나타냅니다.
class Student {
private name: string;
protected grade: number;
public major: string;
constructor(name: string, grade: number, major: string) {
this.name = name;
this.grade = grade;
this.major = major;
}
printInfo() {
console.log(`이름: ${name}, 학년: ${grade}`);
}
}
생성자의 매개변수에 접근 제어자를 작성하면 프로퍼티 필드를 생략할 수 있습니다.
class Student {
constructor(private name: string, protected grade: number, public major: string) {
this.name = name;
this.grade = grade;
this.major = major;
}
printInfo() {
console.log(`이름: ${name}, 학년: ${grade}`);
}
}
생성자의 매개변수에 접근 제어자를 작성하면 자동으로 프로퍼티를 선언한 것으로 간주됩니다. 그래서 따로 명시할 경우 중복 프로퍼티로 오류를 발생시키게 됩니다.
또한 생성자 매개변수에 접근 제어자를 작성하면 this.프로퍼티 = 프로퍼티
도 자동으로 수행해 주기 때문에 다음과같이 더욱 간단하게 클래스를 작성할 수 있습니다.
class Student {
constructor(private name: string, protected grade: number, public major: string) {}
printInfo() {
console.log(`이름: ${name}, 학년: ${grade}`);
}
}
타입스크립트는 abstract
키워드를 이용한 추상 클래스
도 지원을 합니다.
추상 클래스
는 여러 클래스들의 공통적 부분만을 뽑아 만든 클래스로 자체적으로는 인스턴스화가 불가능한 클래스입니다. 추상 클래스를 상속하여 클래스를 구현하는 방식으로 사용합니다.
abstract class Member {
abstract protected name: string;
}
const member = new Member(); //Error! 추상 클래스는 인스턴화 불가능
class Student extends Member {
constructor(private grade: number) {}
}
const student = new Student(); //추상 클래스를 상속하여 만든 클래스만 인스턴스화 가능