개요
타입스크립트에서도 Class 문법을 사용할 수 있다.
접근 제어자 알아보기
접근 제어자란, 클래스의 설계를 위해 클래스의 필드나 메서드에 대한 접근을 제어하기 위해 사용되는 키워드이다.
public
public 으로 선언된 메서드나 필드는 어디에서든 접근이 가능하다.
protected
protected 로 선언된 메서드나 필드는 해당 클래스의 바디 혹은 해당 클래스를 상속받은 클래스의 바디에서만 접근이 가능하다.
private
private 으로 선언된 메서드나 필드는 해당 클래스의 바디에서만 접근이 가능하다.
Private 과 Public field 선언하기
생성자를 이용해 선언할 수도 있고, 생성자에서는 말 그대로 초기화만 할 수도 있다.
생성자를 이용해서 선언하기
constructor내부에접근자,클래스 필드명,타입을 입력하면 된다.
class Person {
constructor(
private firstName: string,
private lastName: string,
public nickname: string
) {}
}
const me = new Person("Jake", "Seo", "Jake Seo");
me.firstName = "Jack"; // error: firstName is private. "only accessible in class body!"
- class body 밖에서는 오직
nickname프로퍼티만 수정이 가능하다.
생성자 없이 선언하기
class Person {
private firstName: string;
public nickname: string;
constructor() {
this.firstName = "Jake";
this.nickname = "Jack";
}
}
위와 같이 생성자 안에서 선언해주지 않아도 private, public 필드를 선언할 수 있다. 단, 생성자에서 초기화해주지 않으면 에러가 날 것이다.
JS 코드로 변환 결과
"use strict";
class Person {
constructor(firstName, lastName, nickname) {
this.firstName = firstName;
this.lastName = lastName;
this.nickname = nickname;
}
}
const me = new Person("Jake", "Seo", "Jake Seo");
me.firstName = "Jack"; // error: firstName is private
public과private키워드는 JS 로 변환된 이후에는 보이지 않는다.
추상 클래스 (abstract class) 사용하기
- 추상 클래스란, 그 자체로 인스턴스화되지는 못하고 상속을 이용해 사용해야 하는 클래스이다.
abstract class Person {
constructor(
private firstName: string,
private lastName: string,
public nickname: string
) {}
getFullName() {
return `${this.firstName} ${this.lastName}`;
}
}
class User extends Person {}
abstract class키워드를 이용해서 만들 수 있다.- 추상 클래스가 된
Person클래스는 더이상 생성자로 즉시 인스턴스화 시킬 수 없다. Person클래스를 상속받은User클래스를 통해 이용할 수 있다.User클래스는Person클래스의 필드, 메서드 둘 다 이용 가능하다.
추상 메서드 (abstract method()) 사용하기
- 추상 메서드란, 구체적인 구현은 나중으로 미루고 어떠한 인터페이스를 가지고 있는지만 알려주는 메서드이다.
- 상속받은 클래스마다 구현이 달라지는 경우에 유용하다.
- ex) 자동차(
Car) 클래스가 있고 운전자가 탑승(getIn())하는 메서드가 있다고 가정했을 때, 좌측통행인 국가의 자동차는 구체적인 구현이 우측 운전석에 탑승하는 것이고, 우측통행인 국가에서는 좌측 운전석에 탑승하는 것이다.
- ex) 자동차(
abstract class Car {
constructor(public driverPosition: "LEFT" | "RIGHT") {}
abstract getIn(): void; // 추상 메서드, 사용하는 쪽에서 반드시 구현해야 한다.
}
class KoreanCar extends Car {
getIn() {
this.driverPosition = "LEFT";
}
}
- 위의 코드에서
KoreanCar는Car추상 클래스를 상속받아getIn()이라는 추상 메서드를 구현하고 있다. abstract class는 타입스크립트에서만 존재하는 개념이다. 자바스크립트로 해석된 이후에는 일반class와 동일해진다.
만일
driverPosition이private이라면 자식 클래스에서도 접근이 불가능하다. 자식 클래스에서 접근이 가능하게 만드려면public혹은protected를 사용해야 한다.
인터페이스 이용하기
interface User {
firstName: string;
lastName: string;
sayHi(name: string): string;
fullName(): string;
}
class Player implements User {
constructor(public firstName: string, public lastName: string) {}
sayHi(name: string) {
return "";
}
fullName() {
return "";
}
}
- 위 코드에서
Player는 반드시firstName,lastName,sayHi(),fullName()을 가져야 한다.- 인터페이스를 구현할 때의 접근 제어자는 반드시
public이어야 한다.
- 인터페이스를 구현할 때의 접근 제어자는 반드시
- 추상 클래스에 비교했을 때, 위의 방식이 갖는 장점은 인터페이스는 자바스크립트 코드로 변하지 않고 사라진다는 점이다.
- 더 깔끔하고, 필요 없는 클래스가 남지 않는다.
- 파일사이즈가 작아진다.
implements는 다중 상속도 가능하다.
static method 사용하기
static method 는 매 인스턴스마다 생성되는 것이 아니라 클래스에 정적으로 존재하는 메서드이다.
class MyClass {
static hello() {
return "hello";
}
}
MyClass.hello(); // OK!
const instance = new MyClass();
instance.hello(); // ERROR: property 'hello' does not exist on type 'MyClass'.
hello() 가 static method 인 경우 위처럼 MyClass.hello() 로 호출이 가능하지만, instance.hello() 는 에러를 내뱉는다. static method 는 자바스크립트 클래스에도 존재하기 때문에, 타입스크립트에만 적용되는 것이 아니라 자바스크립트로 번역되어도 여전히 존재한다.
'Typescript' 카테고리의 다른 글
| 타입스크립트 tsconfig 간단히 살펴보기 (0) | 2022.08.04 |
|---|---|
| 타입스크립트 type 과 interface 특징 및 비교 (0) | 2022.08.01 |
| 타입스크립트의 다형성(Polymorphism) (0) | 2022.07.24 |
| 타입스크립트 함수 호출 시그니처 설정하기 (0) | 2022.07.24 |
| 타입스크립트 never 타입이란? (0) | 2022.07.24 |