Dart의 유틸리티 패키지 supercharged 소개

ChangJoo Park
6 min readJun 9, 2020

들어가기에 앞서⚡️

Dart의 extension method 소개

Dart 프로그래밍 언어는 특정 원시형 (Primitives) 또는 클래스를 확장할 수 있는 도구를 제공합니다. 예를 들면, 문자열을 숫자로 바꾸는 아래의 메소드가 있다면,

int.parse('42')

아래와 같이 원시형 문자열에서 파생되는 새로운 메소드를 만들 수 있습니다.

'42'.parseInt()

구현은 다음과 같습니다.

extension NumberParsing on String {
int parseInt() {
return int.parse(this);
}
}

이는 Ruby 또는 Python 에서 지원하는 extension method 와 동일합니다.

Java의 경우에는 static 메소드, JavaScript는 defineProperty 또는 prototype을 이용한 확장 정도가 유사합니다.

supercharged : extension method 의 집합

supercharged는 Dart 개발의 슈퍼차저가 될수도 있습니다

supercharged는 extension method의 모음입니다. Flutter 패키지 중 Simple Animations 버전 2 에서 주로 사용하고 있습니다. Tween 을 구현하다 보면 어쩔 수 없이 코드가 길어지는데 supercharged에 포함된 Tween 관련 extension method가 코드 길이를 줄여주고, 표현을 단순화하여 가독성을 높여줍니다.

supercharged는 다음의 원시형 또는 클래스를 확장합니다.

알파벳(A-Z)순입니다

  • Animatable
  • Color
  • DateTime
  • Double
  • Duration
  • Error
  • Int
  • Iterable
  • List
  • Map
  • String

예를 들어 Flutter 개발을 할 때 16진수로 이루어진 문자열로 색을 바로 사용할 수 없습니다. color: '#ff00ff' 처럼 사용해보려고 했으나 실제로는 color: const Color(0xff00ff) 로 사용해야합니다. 적응하면 큰 불편함이 없지만 다른 언어 또는 CSS에서 처럼 16진수를 사용하지 못해서 무의식 중에 '#ff00ff' 로 입력하는 경우가 있습니다.

supercharged는 다음과 같이 입력할 수 있도록 도와줍니다

{
color: '#ff00ff'.toColor()
}

아래는 supercharged로 주로 사용할만한 extension method의 목록입니다. 전체 내용은 supercharged 공식문서를 확인해주세요. 모든 supercharged의 extension method는 패키지를 import 한 다음에 사용해야합니다.

자주 사용할만한 supercharged 메소드 소개

문자열 변환

  • 문자열을 JSON으로 변환하기
"[1,2,3]".parseJSON();
  • int, double로 변환
'123'.toInt();
'1.23'.toDouble();

Int

  • 반복
3.times(() => print("Hello"));
  • Duration으로 만들기
10.seconds;
1000.milliseconds;
  • Tween
100.tweenTo(200);

DateTime

  • 날짜 더하기, 빼기
DateTime(2020, 1, 1) + 2.days;
DateTime(2020, 1, 1) - 2.days;
  • 날짜 범위를 리스트로 만들기
DateTime(2020).rangeTo(DateTime(2021));
DateTime(2020, 1, 1).rangeTo(DateTime(2020, 1, 2), by: 1.hours);

Error

  • 특정 조건일 때 Throw
throwIf(n < 1, () => ArgumentError("n must be greater than 0"));
  • 특정 조건이 아닐 때 Throw
throwIfNot(n > 1, () => ArgumentError("n must be greater than 0"));

Iterable Aggregation 과 리스트

  • 리스트 연산
[2, 6, 4, 8].sum();
[2, 6, 4, 8].average();
[2, 6, 4, 8].max();
[2, 6, 4, 8].min();
[2, 6, 4, 8].count();
  • Map 리스트를 Map으로 만들기
[MapEntry("a", 1), MapEntry("b", 2)].toMap(); // {"a": 1, "b": 2}
  • forEach에서 Index 사용하기
["a", "b", "c"].forEachIndex((index, value) {
print("$index : $value");
});
  • 리스트의 특정 위치에서 엘리먼트를 찾거나, 기본값을 리턴
["a", "b"].elementAtOrElse(2, () => "");
  • 리스트 객체의 groupBy
List<Person> persons = [
Person(name: "John", age: 21),
Person(name: "Carl", age: 18),
Person(name: "Peter", age: 56),
Person(name: "Sarah", age: 61)
];
  • 리스트 정렬
[3, 1, 5, 9, 7].sortedBy((a,b) => a.compareTo(b));
  • 리스트를 JSON으로 변경하기
[1, 2, 3].toJSON();

Map

  • Map을 JSON 객체로 변경하기
{"a": 1, "b": 2}.toJSON();

끝으로

supercharged가 반드시 필요한 것은 아니며, Dart 프로그래밍 언어가 개발이 덜 되었다기 보다는 다른 언어를 사용하던 사람들이 익숙한 방법을 Dart에서도 사용할 수 있게 확장한 것으로 보는 것이 더 맞습니다.

JavaScript 프론트엔드 처럼 패키지의 크기를 크게 만드는 경우가 아니기 때문에 다른 언어를 사용해서 개발하던 개발자 분들께서 Flutter를 개발하신다면 한번 쯤 살펴 보면 좋을 것 같습니다.

아래 문서를 통해 Dart의 extension method와 supercharged를 더 깊게 알아보세요

--

--