[TypeScript] 인터페이스 구현하기 (implements)
타입스크립트의 인터페이스(Interface) 는 객체의 타입을 정의하는 용도뿐만 아니라, 클래스의 설계도(Blueprint) 역할도 수행할 수 있다. 쉽게 말해, "이 클래스는 적어도 이 프로퍼티와 이 메서드는 무조건 가지고 있어야 해!"라고 강제하는 것이다. 이때 사용하는 키워드가 바로 implements다. 1. 인터페이스로 설계도 만들기 먼저 게임 캐릭터를 만든다고 가정하고, 캐릭터라면 가져야 할 필수 요소를 인터페이스로 정의해보자. TypeScript interface CharacterInterface { name: string; // 이름 moveSpeed: number; // 이동 속도 move(): void; // 이동 메서드 } 이제 이 인터페이스는 하나의 약속(Contract) 이 된다. "누구든 CharacterInterface를 구현하려면 name, moveSpeed, move()를 반드시 가지고 있어야 한다"는 규칙이 생긴 것이다. --- 2. 클래스에서 구현하기 (implements) 클래스 이름 뒤에 implements 키워드와 인터페이스 이름을 적어주면 된다. TypeScript 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로 숨길 수 없다. TypeScript 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 이어야 한다.