본문 바로가기
language/typescript

📘 클래스와 인터페이스의 관계 – 타입스크립트의 구조적 타입 이해하기

by 죄니안죄니 2025. 4. 27.
🏗️ 타입스크립트 중급 시리즈 – 클래스와 OOP 패턴
🔵 ① 클래스와 인터페이스의 관계 | ⚪ ② 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 () 시그니처를 가진 인터페이스를 통해, 생성자 타입을 제어할 수 있습니다.


📐 클래스와 인터페이스 차이 요약

항목interfaceclass
타입 선언✅ 가능✅ 가능
구현 코드 포함❌ 없음✅ 있음
인스턴스 생성❌ 못함✅ 가능
다중 구현가능가능 (implements)
상속extends 가능단일 class만 extends

🧠 실무 팁

  • interface는 설계 명세에 가깝고, 확장성과 테스트에 유리
  • class는 실제 구현 객체, 로직이 포함된 코드 단위
  • Service나 DTO 같은 객체는 interface로 선언하고, 구현은 class로 나누는 것이 좋음

📘 다음 글 예고

👉 private/protected/public, readonly – 접근 제한자와 캡슐화에 대해 자세히 알아봅니다.

댓글