Class
→ 파라미터들을 써주기만 하면, TS가 알아서 Constructor
함수를 만들어 준다
class Player = {
Constructor(
private firstName: string,
private lastName: string,
public nickname: string
) {}
}
const a = new Player("hello", "bye", "thisisnickname");
a.firstName; // 이 부분은 작동하지 않는다. 왜냐하면 firstName이 private이기 때문이다.
추상 클래스(Abstract Class)
- TS와 객체지향 프로그램이 가지고 있는 뛰어난 기능 중 하나는 추상 클래스(Abstract Class)이다
- 추상 클래스란 다른 곳에서 상속받을 수만 있는 클래스
- 이 클래스는 직접 새로운 인스턴스를 만들 수는 없다
abstract class User {
Constructor(
private firstName: string,
private lastName: string,
public nickname: string
) {}
}
class Player extends User {
} // Player가 User를 상속(extends)
const a = new User("hello", "bye", "thisisnickname"); // User는 추상 클래스이기 때문에 이 코드는 작동하지 않는다.
추상 클래스 속 메소드 / 추상 메소드 (Abstract Method)
abstract class User {
Constructor(
private firstName: string,
private lastName: string,
public nickname: string
) {}
getFullName() {
return `${this.firstName} ${this.lastName}`
} // getFullName이 추상 클래스 안에 들어있는 메소드
}
class Player extends User {
} // Player가 User를 상속(extends)
const a = new Player("hello", "bye", "thisisnickname");
a.getFullName();
- 추상 메소드를 만들기 위해선 메소드를 클래스 안에서 구현하지 않으면 된다
메소드
란, 클래스 안에 존재하는 함수- 추상 클래스 안에서는 추상 메소드를 만들 수 있다. 하지만, 메소드를 구현해서는 안되고 대신에 메소드의 Call Signature만 적어둬야 한다
추상 메소드
는 추상 클래스를 상속받는 모든 것들이 구현을 해야하는 메소드를 의미한다
abstract class User {
Constructor(
private firstName: string,
private lastName: string,
private nickname: string
) {}
abstract getNickName(): void
getFullName() {
return `${this.firstName} ${this.lastName}`
}
}
class Player extends User {
} // getNickName이 구현되지 않았기 때문에 오류 발생
const a = new Player("hello", "bye", "thisisnickname");
- 어떤 property를
private
으로 만든다면 그 클래스를 상속해도 그 property에 접근하지 못한다 - 만약,
private
이 있다면 그 property들은 인스턴스 밖에서 접근할 수 없고, 다른 자식 클래스에서도 접근할 수 없다
abstract class User {
Constructor(
private firstName: string,
private lastName: string,
private nickname: string
) {}
abstract getNickName(): void
getFullName() {
return `${this.firstName} ${this.lastName}`
}
}
class Player extends User {
getNickName() {
console.log(this.nickname);
} // nickname이 private이기 때문에 오류 발생
}
const a = new Player("hello", "bye", "thisisnickname");
- private은 말 그대로 개인적인 것을 말하고, User 클래스의 인스턴스나 메소드에 접근할 수 있으나 이 클래스는 추상 클래스여서 인스턴스화 할 수 없다
- 필드가 외부로부터는 보호되지만 다른 자식 클래스에서는 사용되기를 원한다면
private
을 쓰면 안된다 → 대신protected
를 쓴다
abstract class User {
Constructor(
protected firstName: string,
protected lastName: string,
protected nickname: string
) {}
abstract getNickName(): void
getFullName() {
return `${this.firstName} ${this.lastName}`
}
}
class Player extends User {
getNickName() {
console.log(this.nickname); // protected지만 상속 받았기 때문에 User.nickname 접근 가능
}
}
const a = new Player("hello", "bye", "thisisnickname");
a.firstName; // protected기 때문에 접근 불가. 클래스 밖에서는 접근 불가
💡 추상 메소드가 있는 경우, 추상 클래스를 상속받는 클래스에서 추상 메소드를 구현해야 한다
- 클래스를 상속하는 모든 클래스에서 사용 가능하도록 만들고 싶다 →
protected
- 외부의 모든 곳에서 사용가능하게 만들고 싶다 →
public
(또는, 아무 옵션을 주지 않는다)
제한된 양의 property 혹은 key를 가지는 타입을 정의하는 방법
type Words = {
[key: string]: string
} // object의 type을 선언해야할 때 쓸 수 있음
class Dict {
private words: Words
}
- 위의 경우 객체의 key가 string이고 value가 string임을 선언한 것
- property의 이름은 모르지만, 타입만을 알 때 사용
'개발 > TypeScript' 카테고리의 다른 글
11. 타입스크립트(TypeScript) - Polymorphism + Generic + Class + interface (0) | 2022.10.01 |
---|---|
10. 타입스크립트(TypeScript) - Interface (0) | 2022.09.28 |
8. 타입스크립트(TypeScript) - Concrete Type & Generic Type (0) | 2022.09.04 |
7. 타입스크립트(TypeScript) - Overloading & Polymorphism (다형성) (0) | 2022.09.04 |
6. 타입스크립트(TypeScript) - 타입 & Call Signature (0) | 2022.09.04 |