5장: 인터페이스와 타입 별칭 – 객체 구조화와 계약 설계
객체 구조와 계약의 핵심: 인터페이스와 타입 별칭
TypeScript 세계에서 객체의 형태와 구조를 조직적으로 정의한다는 것은 단순히 변수에 타입을 붙이는 것 이상을 의미합니다. 여러 형태의 데이터와 복잡하게 얽힌 객체군을 명확하게 표현할 수 있어야 하죠. 바로 여기서 인터페이스(interface)와 타입 별칭(type alias)이 진가를 발휘합니다.
인터페이스: 객체의 설계도를 그리다
인터페이스는 마치 객체의 "청사진" 같습니다. 특정 객체가 반드시 포함해야 하는 속성, 그 타입까지 일목요연하게 지정할 수 있습니다. 예를 들어 사용자 데이터를 다룬다면 아래처럼 사용합니다.
interface User {
name: string;
age: number;
isAdmin?: boolean; // 선택적 속성
}
객체가 이 설계도를 따르지 않으면, TypeScript는 즉시 경고를 띄워줍니다. 즉, 객체 간의 약속(계약, contract)을 인터페이스로 기술하는 것이죠. 특히 여러 코드와 협업하거나, 재사용이 많은 경우에 인터페이스의 명확함은 큰 힘이 됩니다.
타입 별칭: 유연성과 확장성을 동시에
타입 별칭은 단순한 객체 형태뿐 아니라, 원시 타입, 유니언, 튜플, 복잡한 타입 구조까지도 이름을 붙여 재사용하도록 도와줍니다. 아래와 같은 예시를 볼 수 있습니다.
type Id = string | number;
type Point = { x: number; y: number };
이처럼 타입 별칭은 객체 타입뿐 아니라, 여러 타입의 조합, 혹은 특정 값의 조합 등에 사용하기 좋아 유연합니다. 때론 함수 타입, 배열 타입 등에도 흔히 쓰입니다.
인터페이스와 타입 별칭: 비슷하지만 다르다
이 두 도구 모두 객체의 구조를 정의한다는 공통점이 있지만, 각각의 고유 기능이 존재합니다. 인터페이스는 상속과 확장을 지원하여, 여러 인터페이스를 합쳐 더욱 풍부한 형태를 만들 수 있습니다. 타입 별칭 역시 인터섹션(&)과 유니언(|) 타입으로 복잡한 케이스를 커버합니다.
주요 차이는 인터페이스는 주로 객체(혹은 클래스)에 초점을 두며, 여러 번 선언해 자동으로 속성을 합칠 수도 있습니다. 반면 타입 별칭은 다양한 타입 구조에 폭넓게 사용되며, 선언의 중복이 불가합니다.
언제 무엇을 써야 할까?
일반적으로 객체의 구조나 클래스와의 연동, 혹은 여러 개발자와의 협업에서는 인터페이스를 추천합니다. 다양한 타입의 조합, 복잡한 타입 변환, 아니면 객체 외의 타입에도 이름이 필요하다면 타입 별칭이 더 자연스럽죠. 실제로 프로젝트 대부분에서는 두 도구를 혼합해서 사용합니다.
객체 구조를 강화하는 실전 예시
함수를 매개로 객체를 다루거나, 여러 종류의 유사 객체를 계층적으로 설계할 때 인터페이스와 타입 별칭을 적절히 섞으면 코드 품질이 급상승합니다. 예를 들어:
interface Shape {
area(): number;
}
type Rectangle = Shape & { width: number; height: number };
type Circle = Shape & { radius: number };
이제 Shape을 기반으로 한 다양한 도형을 자유롭게 확장 가능하며, 타입 별칭의 조합으로 복잡한 도형 구조도 매끄럽게 표현할 수 있습니다.
단단한 기초 위에 세우는 타입 안전성
정확히 정의된 객체 구조와 계약은 타입스크립트가 제공하는 가장 강력한 무기입니다. 인터페이스와 타입 별칭은 “코드의 약속”이 어떤 모양이어야 하는지 명확하게 만들어줍니다. 이 챕터의 내용을 바탕으로, 프로젝트의 작은 데이터 조각 하나까지도 명확하게 설계해 보세요. 다음 장에서는 이 구조를 어떻게 실제 코드에서 더욱 실용적으로 적용하는지 살펴볼 것입니다.