[typescript] 클래스 상속과 인터페이스 구현의 차이점은 무엇인가?

예를 들어, 다음과 같이 부모 클래스인 Person과 이를 상속받아 자식 클래스인 Employee를 정의할 수 있습니다.

class Person {
  name: string;

  constructor(name: string) {
    this.name = name;
  }

  sayHello() {
    console.log(`Hello, my name is ${this.name}`);
  }
}

class Employee extends Person {
  jobTitle: string;

  constructor(name: string, jobTitle: string) {
    super(name);
    this.jobTitle = jobTitle;
  }

  sayHello() {
    super.sayHello();
    console.log(`I work as a ${this.jobTitle}`);
  }
}

const employee = new Employee("John", "Developer");
employee.sayHello();

반면에 TypeScript에서의 인터페이스는 클래스가 특정 속성과 메서드를 반드시 구현해야 함을 명시하기 위해 사용됩니다. 클래스가 인터페이스를 구현할 때는 implements 키워드를 사용하며, 해당 클래스는 인터페이스에서 정의된 모든 속성과 메서드를 구현해야 합니다.

예를 들어, 다음과 같이 Person 인터페이스를 정의하고, 이를 Student 클래스가 구현하는 예시를 살펴볼 수 있습니다.

interface Person {
  name: string;
  sayHello(): void;
}

class Student implements Person {
  name: string;

  constructor(name: string) {
    this.name = name;
  }

  sayHello() {
    console.log(`Hello, my name is ${this.name}`);
  }
}

const student = new Student("Alice");
student.sayHello();

요약하자면, 클래스 상속은 기존 클래스의 속성과 메서드를 상속받는 것이고, 인터페이스 구현은 클래스가 특정 속성과 메서드를 반드시 구현해야 함을 명시하는 것입니다.