Javascript

[TypeScript] 추상 클래스(Abstract Class)

mark340 2023. 1. 28. 11:16

추상화(Abstraction)

 

추상화는 객체 지향 프로그래밍(OOP:Object-Oriented Programming)의 핵심 아이이디어 중 하나이다. 복잡성을 최소화하고 고급 아키텍처 문제를 해결하는데 도움이 되는 기술이며, 하위 수준의 세부 사항을 미리 구현할 필요가 없다. 상위 수준에 집중하고 나중에 세부 사항을 구현한다.

OOP에서는 두 가지 유형의 클래스가 존재한다. 추상 클래스와 구체 클래스이다. 위에서 말한 상위 수준은 추상 클래스이며 하위 수준은 구체 클래스이다.

구체 클래스

  • new 키워드를 사용하여 생성할 수 있다.

추상 클래스

  • 추상 클래스는 구체 클래스가 가져야 하는 속성과 함수를 설정하는 클래스
  • 추상 클래스는 클래스 앞에 abstract 키워드를 사용하여 선언
  • new 키워드를 사용하여 추상 클래스의 객체 인스턴스를 생성 불가
  • TypeScript는 Cannot create an instance of an abstract class라는 오류를 표시

 

 

TypeScript의 추상 클래스

 

가장 일반적인 용도는 하위 클래스(=구체 클래스)에서 공통 동작을 찾는 것

  • 추상 클래스는 객체 인스턴스화할 수 없다는 것을 알고 있다는 전제하에 사용
  • 구체 클래스에 extends 키워드를 사용하여 상속
  • 하위 클래스에서는 상위 클래스의 속성과 함수를 호출할 수 있다.

 

추상 함수

  • 추상 함수는 추상 클래스에서 abstract 키워드를 사용하여 정의한다.
  • 추상 함수는 구체 클래스에서 구현해야 한다.
abstract class Animal {
  private _age: number;
  
  constructor (theAge: number) {
    this._age = theAge;
  }
  
  get age() {
    return this._age;
  }
  
  set age(theAge: number) {
    this._age = theAge;
  }
  
  // 추상 함수
  public abstract makeSound(): void;
}
  • 추상 함수는 구현이 존재하지 않으며, 구체 클래스에서 구현한다.
  • 함수의 이름 / 반환 타입 / 매개 변수만 추상 클래스에서 정의한다.
class Dog extends Animal {
  constructor(theAge: number) {
    super(theAge);
  }

  makeSound(): void {
    console.log('멍');
  }
}

class Cat extends Animal {
  constructor(theAge: number) {
    super(theAge);
  }

  makeSound(): void {
    console.log('야옹');
  }
}

const dog: Dog = new Dog(5);
const cat: Cat = new Cat(3);

dog.makeSound(); // 멍
cat.makeSound(); // 야옹