📑 목차
타입스크립트의 인터페이스(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. 요약
- 설계도 역할: 인터페이스를 사용해 클래스가 가져야 할 필드와 메서드의 구조를 정의할 수 있다.
implements: 클래스가 특정 인터페이스를 준수하도록 강제하는 키워드다.- 규칙: 인터페이스에 정의된 속성은 클래스에서 반드시 구현해야 하며, 접근 제어자는
public이어야 한다.
