TypeScript: Classes Ep.3

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