6. 클래스(Class)
1. readonly
- 클래스의 속성에
readonly
키워드를 사용하면 다음과 같이 접근만 가능하다.
class Developer {
readonly name: string;
constructor(theName: string) {
this.name = theName;
}
}
let john = new Developer("John");
john.name = "John"; // error
- 이처럼
readonly
를 사용하면constructor()
함수에 초기 값 설정 로직을 넣어줘야 하므로 다음과 같이 인자에readonly
키워드를 추가해서 코드를 줄일 수 있다.
class Developer {
constructor(readonly name: string) {}
}
let john = new Developer("John");
console.log(john.name);
2. Getter와 Setter
- 타입스크립트는 객체의 특정 속성의 접근과 할당에 대해 제어할 수 있다.
- 이를 위해선 해당 객체가 클래스로 생성한 객체여야 한다.
- 위 코드는 클래스로 생성한 객체의
name
속성에는Josh Bolton
이라는 값을 대입한 코드이다. - 이제
josh
객체의name
속성은Josh Bolton
이라는 값을 가진다.
- 여기서 만약
name
속성에 제약 사항을 추가하고 싶다면 다음과 같이get
과set
을 활용하면 된다.
class Developer {
// Getter와 Setter 함수명과 같지 않게 해야 한다.
private _name: string;
get name(): string {
return this._name;
}
set name(newValue: string) {
if (newValue && newValue.length > 5) {
throw new Error("이름이 너무 깁니다");
}
this._name = newValue;
}
}
const josh = new Developer();
josh.name = "Josh Bolton"; // Error
josh.name = "Josh";
Note
get
만 선언하고set
을 선언하지 않은 경우에는 자동으로readonly
로 인식된다.
3. 추상 클래스(Abstract Class)
- 추상 클래스는 인터페이스와 비슷한 역할을 하면서도 조금 다른 특징을 갖고 있다.
- 추상 클래스는 특정 클래스의 상속 대상이 되는 클래스이며 좀 더 상위 레벨에서 속성, 메서드의 모양을 정의한다.
abstract class Developer {
// 'abstract'가 붙으면 상속 받은 클래스에서 무조건 구현해야 한다.
abstract coding(): void;
drink(): void {
console.log("drink sth");
}
}
class FrontEndDeveloper extends Developer {
// Developer 클래스를 상속 받은 클래스에서 무조건 정의해야 하는 메서드
coding(): void {
console.log("develop web");
}
design(): void {
console.log("design web");
}
}
const dev = new Developer(); // error. 추상 클래스는 인스턴스화할 수 없다.
const josh = new FrontEndDeveloper();
josh.coding(); // develop web
josh.drink(); // drink sth
josh.design(); // design web