🏗️ 타입스크립트 중급 시리즈 – 클래스와 OOP 패턴
🔵 ① 클래스와 인터페이스의 관계 | ⚪ ② private/protected/public, readonly | ⚪ ③ 추상 클래스 vs 인터페이스 | ⚪ ④ 데코레이터 기초 (NestJS 활용)
🔵 ① 클래스와 인터페이스의 관계 | ⚪ ② private/protected/public, readonly | ⚪ ③ 추상 클래스 vs 인터페이스 | ⚪ ④ 데코레이터 기초 (NestJS 활용)
📘 클래스와 인터페이스의 관계 – 타입스크립트의 구조적 타입 이해하기
타입스크립트는 전통적인 클래스 기반 객체지향 패턴을 지원하면서도, 구조적 타입 시스템(structural typing)이라는 독특한 철학을 가지고 있습니다.
이 글에서는 클래스와 인터페이스가 어떻게 연결되는지 그리고 실무에서 interface를 어떻게 활용하는 것이 좋은지를 예제를 중심으로 설명합니다.
① 클래스가 인터페이스를 "구현"한다
클래스는 인터페이스를 implements 키워드로 구현할 수 있습니다.
interface Person {
name: string;
sayHi(): void;
}
class Developer implements Person {
constructor(public name: string) {}
sayHi() {
console.log(`안녕하세요, ${this.name}입니다.`);
}
}
→ Developer
클래스는 Person
인터페이스의 구조를 정확히 따라야 합니다.
② 인터페이스는 "형태"를 요구한다 (구조적 타입 시스템)
interface Animal {
name: string;
}
const dog = { name: '바둑이', breed: '진돗개' };
const cat: Animal = dog; // ✅ 가능!
타입스크립트는 **이름이 아닌 구조(속성)**로 타입을 판별하기 때문에,
Animal
타입에는 name
만 있으면 충분합니다. 여분의 속성은 무시됩니다.
👉 이걸 구조적 타입 시스템(Structural Typing) 또는 덕 타이핑(Duck Typing)이라고 합니다.
③ 다중 인터페이스 구현 가능
interface Flyable {
fly(): void;
}
interface Swimmable {
swim(): void;
}
class Duck implements Flyable, Swimmable {
fly() {
console.log('날아요');
}
swim() {
console.log('수영해요');
}
}
→ 클래스는 여러 개의 인터페이스를 동시에 구현할 수 있습니다 (다중 상속 대신).
④ 클래스 자체도 타입으로 사용할 수 있다
class Car {
brand: string;
constructor(brand: string) {
this.brand = brand;
}
}
const myCar: Car = new Car('Hyundai');
클래스는 동시에 타입과 생성자 역할을 합니다.
인터페이스가 명세라면, 클래스는 "명세 + 구현 + 타입"이 모두 가능한 형태입니다.
⑤ 생성자 타입이 필요한 경우 – 인터페이스 + 클래스
interface Person {
name: string;
}
interface PersonConstructor {
new (name: string): Person;
}
function createPerson(ctor: PersonConstructor, name: string): Person {
return new ctor(name);
}
new ()
시그니처를 가진 인터페이스를 통해, 생성자 타입을 제어할 수 있습니다.
📐 클래스와 인터페이스 차이 요약
항목 | interface | class |
---|---|---|
타입 선언 | ✅ 가능 | ✅ 가능 |
구현 코드 포함 | ❌ 없음 | ✅ 있음 |
인스턴스 생성 | ❌ 못함 | ✅ 가능 |
다중 구현 | 가능 | 가능 (implements) |
상속 | extends 가능 | 단일 class만 extends |
🧠 실무 팁
- interface는 설계 명세에 가깝고, 확장성과 테스트에 유리
- class는 실제 구현 객체, 로직이 포함된 코드 단위
- Service나 DTO 같은 객체는 interface로 선언하고, 구현은 class로 나누는 것이 좋음
📘 다음 글 예고
👉 private/protected/public, readonly – 접근 제한자와 캡슐화에 대해 자세히 알아봅니다.
'language > typescript' 카테고리의 다른 글
🏛️ 추상 클래스 vs 인터페이스 – 무엇을 언제 써야 할까? (0) | 2025.04.27 |
---|---|
🔐 접근 제한자 & readonly – 클래스 멤버 보호하기 (0) | 2025.04.27 |
💼 실전 타입 유틸 패턴 총정리 & 예제 모음 (0) | 2025.04.27 |
🔁 Mapped Type & Template Literal Type – 실전 예제 중심 정리 (1) | 2025.04.27 |
🎯 Enum vs Const Enum – 차이점과 실무에서의 선택 기준 (0) | 2025.04.27 |
댓글