[typescript] 타입스크립트에서 추상 클래스와 인터페이스의 적절한 사용 예시

타입스크립트를 사용하면 객체지향 프로그래밍을 할 때 추상 클래스와 인터페이스를 활용할 수 있습니다. 그러나 두 가지를 구분하여 적절하게 사용하는 것이 중요합니다. 이번에는 고객과 직원을 다루는 예시를 통해 추상 클래스와 인터페이스의 적절한 활용법을 알아보겠습니다.

인터페이스 활용

인터페이스는 속성과 메서드의 규격을 정의하는데 사용됩니다. 예를 들어, 고객과 직원이라는 두 가지 역할이 있을 때 다음과 같이 인터페이스를 활용할 수 있습니다.

interface Person {
  name: string;
  age: number;
  greet(): void;
}

// 고객 클래스
class Customer implements Person {
  name: string;
  age: number;

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

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

// 직원 클래스
class Employee implements Person {
  name: string;
  age: number;

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

  greet() {
    console.log(`Welcome, my name is ${this.name}`);
  }
}

위의 예시에서 Person 인터페이스는 name, age, greet 메서드를 정의하고 있습니다. 이 인터페이스를 구현한 CustomerEmployee 클래스에서 각각 고객과 직원의 특징을 구현하고 있습니다.

추상 클래스 활용

반면에 추상 클래스는 객체의 일반적인 동작을 정의하는 데 사용됩니다. 예를 들어, 고객과 직원이라는 역할에 공통적으로 가지는 동작을 추상 클래스로 정의할 수 있습니다.

abstract class Person {
  constructor(protected name: string, protected age: number) {}

  abstract greet(): void;
}

// 고객 클래스
class Customer extends Person {
  constructor(name: string, age: number) {
    super(name, age);
  }

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

// 직원 클래스
class Employee extends Person {
  constructor(name: string, age: number) {
    super(name, age);
  }

  greet() {
    console.log(`Welcome, my name is ${this.name}`);
  }
}

위의 예시에서 Person 추상 클래스는 생성자와 greet 메서드를 정의하고 있습니다. 이를 구현한 CustomerEmployee 클래스에서 각각 고객과 직원의 특징을 구현하고 있습니다.

결론

인터페이스와 추상 클래스를 적절하게 활용하여 객체지향 프로그래밍을 할 때, 공통적인 규격에 대한 정의는 인터페이스를 이용하고, 공통적인 동작에 대한 정의는 추상 클래스를 이용하는 것이 좋습니다. 이를 통해 코드의 가독성과 유지보수성을 높일 수 있습니다.

이런 식으로 추상 클래스와 인터페이스를 활용함으로써 타입스크립트에서 객체지향 프로그래밍을 보다 구조화되고 명확하게 할 수 있습니다.