점진적 타이핑(Gradual Typing)은 정적 타입과 동적 타입을 같은 언어 내에서 혼용할 수 있는 타입 시스템이다. 코드베이스를 점진적으로 타입화할 수 있어 동적 언어에서 정적 언어로의 마이그레이션에 유용하다.
핵심 개념
점진적 타이핑의 보장:
1. 완전한 정적 타입 코드: 런타임 타입 오류 없음
2. 완전한 동적 타입 코드: 기존과 동일 동작
3. 혼합 코드: 경계에서 런타임 검사 수행
물음표 타입(?): 모든 타입과 일관성(Consistency) 관계
typescript
// 점진적 타입화 예시
// 1단계: any 사용 (동적)
function processData(data: any) {
return data.value * 2;
}
// 2단계: 부분 타입 추가
interface DataItem {
value: number;
label?: string; // 선택적 필드
}
function processData(data: DataItem) {
return data.value * 2;
}
// 3단계: 완전한 타입
interface DataItem {
value: number;
label: string;
metadata: Record<string, unknown>;
}
// 타입 어서션으로 경계 처리
const result = (externalData as DataItem).value;
python
from typing import Optional, Union, Any
# 동적 (힌트 없음)
def process(data):
return data['value'] * 2
# 점진적 타입화
def process(data: dict[str, Any]) -> int:
return data['value'] * 2
# 완전한 타입
from dataclasses import dataclass
@dataclass
class DataItem:
value: int
label: str
def process(data: DataItem) -> int:
return data.value * 2
타입 일관성 (Type Consistency)
일관성 관계 (~):
? ~ τ (물음표는 모든 타입과 일관)
τ ~ ? (모든 타입은 물음표와 일관)
τ ~ τ (같은 타입끼리 일관)
(τ₁→τ₂) ~ (τ₁'→τ₂')
iff τ₁ ~ τ₁' and τ₂ ~ τ₂'
일관성 ≠ 서브타이핑!
일관성은 컴파일 타임 허용 여부,
실제 타입 검사는 런타임 캐스트에서
주요 점진적 타입 언어
| 언어 | 도구 | 특징 |
|---|
| JavaScript | TypeScript, Flow | 점진적 마이그레이션 |
| Python | mypy, pyright | 선택적 타입 힌트 |
| PHP | Hack | Facebook 개발 |
| Ruby | Sorbet, RBS | 사후 타입 추가 |
| Racket | Typed Racket | 이론적 기반 |
관련 개념