TypeScript

[TypeScript] 인터페이스 구현하기 (implements)

2025년 11월 27일
2
TypeScriptStudyClassInterfaceOOP

📑 목차

타입스크립트의 인터페이스(Interface) 는 객체의 타입을 정의하는 용도뿐만 아니라, 클래스의 설계도(Blueprint) 역할도 수행할 수 있다.

쉽게 말해, "이 클래스는 적어도 이 프로퍼티와 이 메서드는 무조건 가지고 있어야 해!"라고 강제하는 것이다. 이때 사용하는 키워드가 바로 implements다.

1. 인터페이스로 설계도 만들기

먼저 게임 캐릭터를 만든다고 가정하고, 캐릭터라면 가져야 할 필수 요소를 인터페이스로 정의해보자.

interface CharacterInterface {
  name: string;      // 이름
  moveSpeed: number; // 이동 속도
  move(): void;      // 이동 메서드
}

이제 이 인터페이스는 하나의 약속(Contract) 이 된다. "누구든 CharacterInterface를 구현하려면 name, moveSpeed, move()를 반드시 가지고 있어야 한다"는 규칙이 생긴 것이다.


2. 클래스에서 구현하기 (implements)

클래스 이름 뒤에 implements 키워드와 인터페이스 이름을 적어주면 된다.

class Character implements CharacterInterface {
  // 생성자 매개변수에 접근 제어자를 붙여 필드 선언과 초기화를 한 번에 해결
  constructor(
    public name: string,
    public moveSpeed: number,
    private extra: string // 인터페이스에 없는 건 마음대로 추가 가능
  ) {}

  // 인터페이스에 정의된 메서드 구현
  move(): void {
    console.log(`${this.moveSpeed} 속도로 이동!`);
  }
}

이제 Character 클래스는 CharacterInterface의 규칙을 따르게 된다. 만약 인터페이스에 정의된 프로퍼티나 메서드를 하나라도 빼먹으면 에러가 발생한다.

구현 시 주의할 점 (접근 제어자)

인터페이스에 정의된 프로퍼티나 메서드는 클래스에서 구현할 때 무조건 public 이어야 한다.

인터페이스는 기본적으로 "외부에 노출되는 인터페이스(접점)"를 정의하는 것이기 때문에, 이를 private이나 protected로 숨길 수 없다.

interface CharacterInterface {
  name: string;
}

class Character implements CharacterInterface {
  // ❌ 에러: 인터페이스의 속성은 private일 수 없음
  // private name: string; 
  
  constructor(public name: string) {} // ✅ public은 가능
}

참고: 인터페이스에 정의되지 않은 추가 필드(private extra 등)는 private이나 protected로 자유롭게 설정할 수 있다.


3. 요약

  1. 설계도 역할: 인터페이스를 사용해 클래스가 가져야 할 필드와 메서드의 구조를 정의할 수 있다.
  2. implements: 클래스가 특정 인터페이스를 준수하도록 강제하는 키워드다.
  3. 규칙: 인터페이스에 정의된 속성은 클래스에서 반드시 구현해야 하며, 접근 제어자는 public 이어야 한다.
@taemni

@taemni

안녕하세요, 차근차근 성장 중인 조태민입니다.

instagram

댓글