추상 클래스와 인터페이스 (typescript)

모성종·2024년 3월 15일
0

추상 클래스 (Abstract Class)

추상 클래스는 직접 인스턴스화할 수 없는 클래스이다. new 키워드로 인스턴스로 만들수 없고, 서브클래스로 분류된다는 뜻이다.

  • 추상 클래스는 추상 메소드(본문이 없는 메소드)와 구현 메소드(본문이 있는 메소드)를 모두 가질 수 있다.
  • 추상 클래스에는 멤버 변수도 있을 수 있다.
  • 추상 클래스의 하위 클래스는 자체가 추상이 아닌 한 추상 클래스에 정의된 모든 추상 메서드를 구현해야 한다.
  • extends 키워드로 상속받는다.

예시

abstract class Animal {
  abstract speak(): void;
  
  constructor(protected name: string) {}
  
  public getName(): string {
    return `${this.name}`;
  }
}

class Dog extends Animal {
  speak() {
    console.log("멍멍");
  }
}

class Cat extends Animal {
  speak() {
    console.log("야옹");
  }
}

const dog = new Dog("누렁이");
dog.speak(); // 멍멍
console.log(dog.getName()); // 누렁이

const cat = new Cat("나비");
cat.speak(); // 야옹
console.log(cat.getName()); // 나비

인터페이스 (Interface)

인터페이스는 객체의 구조를 정의하는 구문이다.

  • 메서드 구현이 없다.
  • 멤버 변수나 구체적인 메서드가 있을 수 없습니다.
  • 인터페이스로 상속(구현) 시 클래스는 여러 인터페이스를 구현할 수 있다.
  • 인터페이스를 구현하는 클래스는 인터페이스에 선언된 모든 메서드에 대한 구현을 제공해야 한다.
  • implements 키워드로 구현한다.

예시1

interface Animal {
  speak(): void;
}

class Dog implements Animal {
  speak() {
    console.log("멍멍");
  }
}

예시2

interface Drawable {
  draw(): void;
}

class Circle implements Drawable {
  draw() {
    console.log("원을 그린다.");
  }
}
class Square implements Drawable {
  draw() {
    console.log("사각형을 그린다.");
  }
}

const c = new Circle();
c.draw(); // 원을 그린다.

const s = new Square();
s.draw(); // 사각형을 그린다.

상속 관점에서의 차이

  • 추상 클래스는 다른 클래스로부터 상속받을 수 있으며, 하위 클래스에게 추상메서드 구현을 강제할 수 있다.

    • 상속받은 하위 클래스에서 abstract method는 반드시 구현해야 함.
  • 반면에 인터페이스는 상속받을 수 없지만, 여러개의 인터페이스를 동시에 구현하여 기능을 조합할 수 있다.

    • implements A, B, C 와 같이 여러 인터페이스를 동시에 구현할 수 있다.
profile
FE Developer

0개의 댓글