Singletons
singleton pattern
어플리케이션이 실행되는 중간에 클래스로 부터 단 하나의 오브젝트만을 생성해서 사용하는 패턴
static과 private 사용하기. static을 통해서 데이터를 공유.
class ClassName {
private static instance: ClassName | null = null;
public static getInstance(): ClassName {
// ClassName으로부터 만든 object가 있으면, 리턴
// ClassName으로부터 만든 object가 없으면, 생성
if (ClassName.instance === null) {
ClassName.instance = new ClassName();
}
return ClassName.instance;
}
private constructor() {}
}
const aa = ClassName.getInstance(); // 최초로 불리기에 object 생성
const bb = ClassName.getInstance(); // 생성이 되어 있기에 그냥 리턴
console.log(aa === bb); // true
상속 (Inheritance)
-
부모 클래스
class Parent { constructor(protected _name: string, protected _age: number) {} public print(): void { console.log(`이름은 ${this._name}이고 나이는 ${this._age}입니다.` ) } } const p = new Parent("Jin", 24) p.print()
-
자식 클래스
-
Parent 상속받은 Child 클래스가 아무것도 하지 않아도 Parent의 생성자를 그대로 가져오기 때문에 Parent와 동일한 형태로 넣어서 사용할 수 있다.
class Child extends Parent {} const c = new Child("Son", 13) c.print()
-
property 추가하기
접근 제어자까지 오버라이드 된다.
class Child extends Parent { public _name = "Mark"; public gender = "male"; } const c = new Child("Son", 13) c._name
-
Parent의 생성자 오버라이드
자식의 생성자에서는 무조건 super가 가장 먼저 호출되어어야 한다.
부모와 자식 클래스는 각자의 영역에서 서로에게 영향을 주지 않도록 하는 것이 중요하다.
class Parent { constructor(protected _name: string, private _age: number) {} public print(): void { console.log(`이름은 ${this._name}이고 나이는 ${this._age}입니다.` ) } protected printName(): void { console.log(this._name, this._age) } } class Child extends Parent { public gender = "male"; constructor(age: number) { super("Mark", age); this.printName(); } } const c = new Child(5); c.print(); // Mark 5 // 이름은 Mark이고 나이는 5입니다.
-
Abstract Classes
Abstract를 사용하면 완전하지 않은 클래스를 표현할 수 있다.
완전하지 않은 클래스는 new 키워드를 이용하여 개체를 만들 수 없다.
완전하지 않은 개체를 상속과 같은 기능으로 완전하게 만든다.
- abstract 키워드를 이용해서 특정 메소드를 표현할 수 있다.
단, 해당 메소드는 abstract 키워드를 사용했기 때문에 구현( 괄호 사용 )하지 않는다. - abstract 키워드가 붙으면 class 키워드 앞에 abstract를 붙여야 한다.
-
abstract 클래스는 기능이 완전하지 않기 때문에 new를 사용할 수 없다.
abstract class AbstractPerson { protected _name: string = "Mark"; abstract setNamed(name: string) : void; } new AbstractPerson() // error 발생
-
상속을 이용해서 클래스를 완전하게 만들어주기
class People extends AbstractPerson { setNamed(name: string): void { this._name = name; } } const p = new People(); p.setNamed();
Comments