Extension Types

컴파일 타임에 래핑되며 런타임에 추가 객체가 생성되지 않습니다(제로 오버헤드). 기존 타입에 새로운 정적 인터페이스를 부여하고 사용 가능한 메서드를 제한하는 목적으로 활용합니다.

일반 Extension과의 차이점: 일반 확장은 원본 타입의 모든 인스턴스에 메서드를 추가하지만, Extension Type은 정적 타입이 해당 확장 타입일 때만 작동합니다.

// int 는 표현 타입, id 는 하위 원시 값 이름
extension type IdNumber(int id) {
  operator <(IdNumber other) => id < other.id;
}Code language: Dart (dart)

자동 생성 항목:

  1. 암시적 생성자 IdNumber(int id)
  2. 게터: 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

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다