1. 핵심 개념 비교
- interface 객체 타입(함수, 클래스, 인덱스 서명 등)을 기술하는 데 최적화됨. 구조적 형식(Shape) 정의에 중점을 두며, OOP 환경에서 유연하게 확장 가능.
- type 복잡한 타입 연산이나 추상화를 위한 타입 별칭으로, 다양한 타입(공용 타입, 튜플, 원시 값 등)을 표현 가능. 기능적으로 더 넓은 범위를 지원.
2. 기능적 차이점
| 특성 | interface | type |
|---|---|---|
| 선언 통합 | 동일 이름으로 추가 가능 | 동일 이름 시 오류 발생 |
| 상속 방식 | extends 키워드 사용 | & 연산자로 교차 타입 생성 |
| 구현 지원 | 클래스 직접 구현 가능 | 객체 타입만 구현 가능 |
| 공용 타입 | 불가능 | 가능 (예: `type ID = string |
| 매핑/조건 타입 | 불가능 | 가능 (예: keyof, 조건 타입) |
| 함수 타입 | 호출 서명 정의 가능 | 화살표 함수 문법 지원 (예: () => void) |
3. 실습 예제
타입 확장
// interface 상속
interface Person {
name: string;
}
interface Student extends Person {
studentId: number;
}
// type 교차 타입
type Person = { name: string };
type Student = Person & { studentId: number };
공용 타입 정의
// type 활용
type Identifier = string | number;
// interface로는 직접 정의 불가
선언 통합
// interface 자동 통합
interface User { name: string; }
interface User { age: number; }
const user: User = { name: "John", age: 25 }; // 통합 성공
// type 중복 오류
type User = { name: string };
type User = { age: number }; // 오류 발생
복잡한 타입 연산
// type의 매핑 타입 지원
type Properties = "name" | "age";
type Profile = {
[K in Properties]: string; // 매핑 구조
};
// interface에서는 해당 기능 제한
4. 사용 패턴 가이드
-
interface 적합 시나리오
-
객체 구조 정의 (선언 통합 필요 시)
-
클래스 구현 (implements 키워드 사용 시)
-
외부 라이브러리 확장 (새로운 속성 추가)
-
type 적합 시나리오
-
복합 타입 설계 (공용 타입, 튜플 등)
-
고급 타입 연산 (매핑, 조건 타입 등)
-
일회성 타입 별칭 정의
5. 비교 요약
| 분야 | interface | type |
|---|---|---|
| 설계 목적 | 객체 구조 기술 (OOP 중심) | 모든 타입 대상 별칭 제공 |
| 유연성 | 제한적 (객체 구조에 집중) | 다양한 타입 처리 가능 |
| 확장 방법 | 선언 통합, extends | 교차 타입, 조건 타입 |
| 적용 영역 | 공용 API, 클래스 구현 | 복합 타입, 임시 타입 |
실제 개발 시: 객체 타입 정의는 두 방식 모두 가능하나, 명확한 구조 관리를 위해 interface를 우선적으로 사용하고, 복잡한 타입 로직에는 type을 보조적으로 활용하는 것이 좋습니다.