Dart의 유틸리티 패키지 supercharged 소개
들어가기에 앞서⚡️
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는 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를 더 깊게 알아보세요