TS에서의 Class
는 JS에서의 Class와 별반 다르지 않다.
다만, 생성자 메서드에서 사용될 클래스의 프로퍼티들을 미리 정의해주어야 한다.
class Person {
name: string;
constructor(name: string) {
this.name = name;
}
sum(a: number, b: number): number {
return a + b;
}
}
public
클래스 안에 선언된 프로퍼티와 메서드를 어디서든 접근 가능함.
별도로 접근 제어자를 선언하지 않으면 기본값.
class WaterPurifier {
public waterAmount: number;
constructor(waterAmount: number) {
this.waterAmount = waterAmount;
}
public wash() {
if(this.waterAmount > 0) {
console.log('정수기 동작 성공');
}
}
let purifier = new WaterPurifier(50);
console.log(purifier.waterAmount); // 50
purifier.wash(); // 정수기 동작 성공
private
클래스 코드 외부에서 클래스의 프로퍼티와 메서드를 접근할 수 없음.
해당 프로퍼티에 접근 또는 수정이 필요한 경우 getter
, setter
메서드를 작성해서 사용.
class Person {
private _name: string;
constructor(name: string) {
this._name = name;
}
// Getter 메서드
get name(): string {
return this._name;
}
// Setter 메서드
set name(newName: string) {
if(newName.length > 0) this._name = newName;
else console.log('이름이 잘못 되었습니다.')
}
}
const person = new Person('Vanlan');
console.log(person.name); // 'Vanlan'
person.name = 'Kim';
console.log(person.name); // 'Kim'
console.log(person._name); // 에러
protected
private
과 비슷하지만 다르다.
클래스 코드 외부에서 사용할 수 없다는건 동일 하나, 상속받은 클래스에서는 사용할 수 있다.
class Person {
protected name: string;
protected skill: string;
constructor(name: string, skill: string) {
this.name = name;
this.skill = skill;
}
protected sayHi(): void {
console.log('hi');
}
}
class Developer extends Person {
constructor(name: string, skill: string) {
super(name, skill);
this.sayHi();
}
coding(): void {
console.log(`fun doing ${this.skill} by ${this.name}`);
}
}
접근 제어자 사용시 주의점