패스트캠퍼스 TypeScript 강의 Ch 6. Class 복습 내용
참고링크
어플리케이션이 실행되는 중간에 클래스로부터 단 하나의 오브젝트만 생성해서 사용하는 패턴
class ClassName {
private static instance: ClassName | null = null;
public static getInstance(): ClassName {
// ClassName으로부터 생성된 오브젝트가 있으면 해당 오브젝트를 리턴하고, 없으면 생성하여 리턴
if (ClassName.instance === null) {
ClassName.instance = new ClassName();
}
return ClassName.instance;
}
private constructor() {}
}
constructor() 메서드에 접근제어자 private를 지정하면 인스턴스 생성이 불가능해지므로 간단하게 싱글톤 패턴을 구성할 수 있다. (검증된 디자인 패턴을 활용하여 코드를 작성하면 명확한 논리구조를 짤 수 있다는건 알겠지만 아직 싱글톤 패턴의 사용목적과 장단점을 정확하게 파악하지 못했다.. 추후 직접 활용하면서 확인해볼 예정😓)
extends 키워드를 통해 사용하며, 부모 클래스의 프로퍼티와 메서드를 물려받으면서 멤버를 추가로 지정할 수 있도록 해준다. (protected로 지정된 멤버를 활용할 수 있다.)
class Parent {
constructor(protected _name: string, private _age: number) {}
// _name과 _age 모두 외부에서 접근이 불가능하지만 protected로 제어된 _name은 서브클래스에서는 접근이 가능하다.
public print(): void {
console.log(`이름은 ${this._name} 이고, 나이는 ${this._age}살 입니다.`);
}
}
const p = new Parent('Mark', 30);
p.print(); // 이름은 Makr이고, 나이는 30살 입니다.
class Child extends Parent {
constructor(age: number) {
super('Mark Jr', age);
}
}
const c = new Child(5);
c.print(); // 이름은 Mark Jr. 이고, 나이는 5살 입니다.
자식 클래스의 생성자 구문에서는 super() 메서드를 호출해야 한다. (추가 구문 작성시 super()가 우선 작성되어야 함.)
abstract 키워드를 통해 완전하지 않은 클래스를 표현할 수 있으며, 해당 객체는 new를 통해 생성이 불가능하다.
abstract class AbstractPerson {
protected _name: string = 'Haryun';
abstract setName(name: string): void; // 메서드의 실행문을 구현하지 않음 => 불완전한 상태
}
// abstract 클래스는 상속을 통해 서브클래스에서 완전한 형태로 만들고 사용할 수 있음
class Person extends AbstractPerson {
// 서브클래스는 상속받은 추상 클래스의 완전하지 못한 부분을 필수로 구현해야함 => 미작성시 에러 발생
setName(name: string): void {
this._name = name;
}
}
const p = new Person();
p.setName('Harin') ;
추상 클래스는 추상 메서드 뿐만 아니라 일반 메서드와 프로퍼티도 포함할 수 있다.