컴파일 타임에 래핑되며 런타임에 추가 객체가 생성되지 않습니다(제로 오버헤드). 기존 타입에 새로운 정적 인터페이스를 부여하고 사용 가능한 메서드를 제한하는 목적으로 활용합니다.
일반 Extension과의 차이점: 일반 확장은 원본 타입의 모든 인스턴스에 메서드를 추가하지만, Extension Type은 정적 타입이 해당 확장 타입일 때만 작동합니다.
// int 는 표현 타입, id 는 하위 원시 값 이름
extension type IdNumber(int id) {
operator <(IdNumber other) => id < other.id;
}Code language: Dart (dart)
자동 생성 항목:
- 암시적 생성자
IdNumber(int id) - 게터:
int get id
주로 사용하는 두 가지 모드
1) 불투명 모드
인터페이스 격리|비즈니스 규칙 제한에 권장
implements 키워드를 적지 않음
하위 타입의 메서드를 차단해 인터페이스 제약 구현
하위 원시 타입과 직접 값을 할당할 수 없음
extension type IdNumber(int id) {
operator <(IdNumber other) => id < other.id;
}
void main() {
final id = IdNumber(100);
id + 5; // 컴파일 오류: + 연산자 없음, int 덧셈 차단됨
final int raw = id; // 오류, 직접 할당 불가
final int raw = id as int; // 명시적 캐스트로 원본 값 가져오기
}Code language: PHP (php)
2) 투명 모드
implements 표현타입
하위 타입의 모든 멤버를 자동 상속하며 메서드 추가 및 재정의만 가능
extension type Num(int v) implements int {
Num square() => Num(v * v);
}
void main() {
final n = Num(5);
print(n.isNegative); // int 기본 메서드를 바로 호출 가능
}Code language: Dart (dart)
생성자 사용 방식
괄호 매개변수가 기본 생성자이며 ._로 비공개 처리해 숨길 수 있음
extension type Id._(int _raw) {
// 외부에서는 이름 지정 생성자만 사용 가능, 직접 Id(xxx) 호출 금지
Id.create(int value) : _raw = value;
}Code language: JavaScript (javascript)
지원 가능: 메서드, 게터, 세터, 연산자
금지 항목: 인스턴스 변수, 추상 멤버
Extension Types
Previous: 확장 메서드 (Extension methods)
Next: Class Modifiers 클래스 수식자