Dart - Extension method

MJ·2023년 5월 30일
0

다른 개발자들이 개발한 API를 사용할 때 기능을 추가하기 위해 사용

Static types and dynamic

// dynamic 타입의 변수에는 Extension method를 사용할 수 없다
dynamic d = '10';
print(d.parseInt()); // 런타임 에러 : NoSuchMethodError

// Extention method는 Dart의 타입 추론을 사용함 -> 아래 v는 String 타입으로 추론되어 정상동작함
var v = '2';
print(v.parseInt()); // 2

API conflicts

-> extension method가 인터페이스나 다른 extension method와 충돌하는 경우(메소드명 동일)

  • show 혹은 hide를 사용해 노출되는 API를 제한하는 방법
// String 확장 메서드인 parseInt()를 정의하는 라이브러리.
import 'string_apis.dart';

// parseInt()를 정의하는 또다른 라이브러리.
// hide를 사용하여 NumberParsing2의 확장 메서드를 숨깁니다.
import 'string_apis_2.dart' hide NumberParsing2;

// 'string_apis.dart'에 정의된 parseInt()를 사용합니다.
print('42'.parseInt());
  • 사용하려는 클래스를 명시해준다
// 두 라이브러리 모두 parseInt()를 가지는
// String에 대한 확장을 가지고 있고, 해당 확장들은 다른 이름을 가지고 있습니다.
import 'string_apis.dart'; // Contains NumberParsing extension.
import 'string_apis_2.dart'; // Contains NumberParsing2 extension.

// ···
// print('42'.parseInt()); // 작동하지 않습니다.
print(NumberParsing('42').parseInt());
print(NumberParsing2('42').parseInt());
  • Extension method의 이름이 같아면 prefix로 이름을 지정해주는 것도 좋음
// 두 라이브러리 모두 parseInt() 확장 메서드를 가지는 NumberParsing 메서드를 가지고 있습니다.
// 'string_apis_3.dart'의 NumberParsingOne 확장도 parseNum()을 가지고 있습니다.
import 'string_apis.dart';
import 'string_apis_3.dart' as rad;

// ···
// print('42'.parseInt()); // Doesn't work.

// string_apis.dart의 ParseNumbers 확장을 사용합니다.
print(NumberParsing('42').parseInt());

// string_apis_3.dart의 ParseNumbers 확장을 사용합니다.
print(rad.NumberParsing('42').parseInt());

// string_apis_3.dart만 parseNum()을 가지고 있습니다.
print('42'.parseNum());

Extension method 구현

extension <extension name>? on <type> {
  (<member definition>)*
}
extension NumberParsing on String {
  int parseInt() {
    return int.parse(this);
  }

  double parseDouble() {
    return double.parse(this);
  }
}

출처 https://dart-ko.dev/language/extension-methods

profile
느긋하게 살자!

0개의 댓글