타입스크립트를 사용하면 객체지향 프로그래밍을 할 때 추상 클래스와 인터페이스를 활용할 수 있습니다. 그러나 두 가지를 구분하여 적절하게 사용하는 것이 중요합니다. 이번에는 고객과 직원을 다루는 예시를 통해 추상 클래스와 인터페이스의 적절한 활용법을 알아보겠습니다.
인터페이스 활용
인터페이스는 속성과 메서드의 규격을 정의하는데 사용됩니다. 예를 들어, 고객과 직원이라는 두 가지 역할이 있을 때 다음과 같이 인터페이스를 활용할 수 있습니다.
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
메서드를 정의하고 있습니다. 이 인터페이스를 구현한 Customer
와 Employee
클래스에서 각각 고객과 직원의 특징을 구현하고 있습니다.
추상 클래스 활용
반면에 추상 클래스는 객체의 일반적인 동작을 정의하는 데 사용됩니다. 예를 들어, 고객과 직원이라는 역할에 공통적으로 가지는 동작을 추상 클래스로 정의할 수 있습니다.
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
메서드를 정의하고 있습니다. 이를 구현한 Customer
와 Employee
클래스에서 각각 고객과 직원의 특징을 구현하고 있습니다.
결론
인터페이스와 추상 클래스를 적절하게 활용하여 객체지향 프로그래밍을 할 때, 공통적인 규격에 대한 정의는 인터페이스를 이용하고, 공통적인 동작에 대한 정의는 추상 클래스를 이용하는 것이 좋습니다. 이를 통해 코드의 가독성과 유지보수성을 높일 수 있습니다.
이런 식으로 추상 클래스와 인터페이스를 활용함으로써 타입스크립트에서 객체지향 프로그래밍을 보다 구조화되고 명확하게 할 수 있습니다.