이전 포스팅으로 객체와 변수, 함수 등의 타입 선언 방법에 대해 다루었다.
이번 포스팅에서는 클래스의 타입을 선언하는 방법에 대해서 정리하고자 한다.
타입스크립트의 클래스 선언 방법은 자바스크립트와 유사하지만,
접근 제어자, getter/setter, 인터페이스, abstract 클래스 등 타입스크립트만의 고유 기능이 있으며
이 기능들을 활용하면 좀 더 명확하고 안정성이 높은 코드를 짤 수 있다.
1. 클래스의 타입 선언 방법 / constructor 단축구문
클래스의 타입을 설정하는 타입스크립트의 기본 문법은 아래와 같다.
자바스크립트의 클래스 선언과 동일하게 필드 선언과 초기화(constructor)가 들어가 있고, 여기에 타입이 추가된다.
class User {
name: string;
age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
}
이때 constructor 단축구문을 활용하면 필드 선언과 초기화를 한 번에 할 수 있다.
class User {
constructor(
public name: string,
public age: number
) {}
}
2. 제어자 (public, protected, private, readonly)
자바스크립트와 달리 타입스크립트에는 제어자가 존재한다.
제어자는 클래스 필드에 대한 접근을 제어할 수 있다.
- public: 기본 접근 제어자, 어디에서든 접근 가능
- private: 클래스 내부 및 서브클래스에서만 접근 가능
- protected: 클래스 내부 및 해당 클래스의 인스턴스에서만 접근 가능
- readonly: 읽기 전용 속성으로, 클래스 내부에서만 수정할 수 있음
class Animal {
constructor(
public name: string,
private type: string,
protected age: number,
readonly species: string
) {}
}
class Dog extends Animal {
constructor(name: string, age: number) {
super(name, 'Dog', age, 'Canine'); //부모 클래스로부터 상속
}
getDogAge(): number {
return this.age;
}
}
const dog = new Dog('Buddy', 5);
console.log(dog.name); // public 속성이라 자유롭게 접근 가능
console.log(dog.getDogAge()); // private 속성이라 get 메서드로 접근
// console.log(dog.type); // 에러 발생:private 속성
// dog.species = 'Feline'; // 에러 발생:readonly 속성
3. getter & setter
자바스크립트와 동일하게 getter와 setter을 활용해 private 필드에 안전하게 접근할 수 있다.
class User {
constructor(
public name: string,
private _age: number
) {}
get age(): number{
return this._age;
}
set age(newAge: number){
if(newAge<0){
throw new Error("Age cannot be negative!");
}
this._age = newAge;
}
}
const lily = new User("lily", 20);
lily.age //get 20
lily.age = 50 //set 50
4. 인터페이스를 활용한 선언
인터페이스를 활용해 클래스를 선언할 수도 있다.
특정 인터페이스로 클래스를 구현하려면, implement 키워드를 사용하면 된다.
interface Name{
name: string;
sayHi(): void;
}
class User implements Name{
constructor(
public name: string,
private _age: number
) {}
sayHi(): void {
console.log(`Hi, my name is ${this.name}`);
}
}
const lily = new User("lily", 20);
lily.sayHi(); //Hi, my name is lily
5. abstract 클래스
abstract 키워드를 붙인 추상 클래스는 자신의 인스턴스를 생성할 수 없다.
추상 클래스는 다른 클래스가 반드시 구현해야 하는 메서드를 정의할 수 있다.
이런 점에서 추상 클래스는 인터페이스와 유사하지만 차이점이 있다.
추상 클래스는 인터페이스와 달리 구현을 가질 수 있으며, 스태틱 메서드와 속성도 가질 수 있다.
이로 인해 추상 클래스는 인터페이스보다 더 유연한 구조를 제공한다.
- 추상 메서드 (abstract)
- abstract 키워드를 사용
- 구현이 없어야 함
- 서브클래스에서 반드시 구현해야 함
- 일반 메서드
- 구현을 가짐
- 서브 클래스에서 재정의(오버라이드) 가능
- 인스턴스에 속하며, 인스턴스를 통해 호출
- this 키워드로 인스턴스 속성에 접근 가능
- 정적 메서드 (static)
- static 키워드를 사용
- 클래스 자체에 속하며, 클래스를 통해 호출
- this 키워드로 해당 클래스의 정적 속성에 접근 가능
- 인스턴스에 접근 불가
abstract class Name {
constructor(public name: string, public age: number) {}
// 추상 메서드: 서브클래스에서 반드시 구현해야 함
abstract sayHi(): void;
// 스태틱 메서드
static saySpecies(): void {
console.log("I'm human");
}
// 일반 메서드
sayAge(): void {
console.log(`I am ${this.age} years old.`);
}
}
class User extends Name {
constructor(name: string, age: number) {
super(name, age);
}
// 추상 메서드 구현
sayHi(): void {
console.log(`Hi, my name is ${this.name}.`);
}
}
const user = new User('Alice', 30);
user.sayHi(); // "Hi, my name is Alice." //추상 메서드
user.sayAge(); // "I am 30 years old." //일반 메서드
Name.saySpecies(); // "I'm human" //스태틱 메서드
'TYPESCRIPT' 카테고리의 다른 글
(Typescript) 제너릭 generic이란? 사용 방법 (0) | 2024.06.23 |
---|---|
(Typescript) 유니온 타입(|)과 인터섹션 타입(&)이란? 사용법 정리 (0) | 2024.06.21 |
(Typescript) 타입 선언 방법 정리 2편, 인터페이스란? 타입 별칭과의 차이 (0) | 2024.06.20 |
(Typescript) 타입스크립트, 타입 선언 방법 정리 1편 (0) | 2024.06.06 |