Dart : https://dart.dev/guides/language/language-tour
1. Callable classes
- Dart 클래스의 인스턴스가 함수처럼 호출되도록하려면 call() 메서드를 구현하면 된다
- 아래 예제에서 WannabeFunction 클래스는 세 개의 문자열을 가져와서 연결하고 각 문자열을 공백으로 구분하고 느낌표를 추가하는 call() 함수를 정의했다
class WannabeFunction {
String call(String a, String b, String c) => '$a $b $c!';
}
var wf = WannabeFunction();
var out = wf('Hi', 'there,', 'gang');
main() => print(out);
// result
Hi there, gang!
2. Typedefs
- Dart 에서 함수는 문자와 숫자같은 객체이다
- typedef 또는 function-type alias 는 필드와 반환 타입을 선언 할 때 사용할 수있는 이름을 함수 타입에 제공한다
- 현재 typedef 는 함수 타입에 제한되며 추후 변경될 수 있다
- typedef 는 함수 타입이 변수에 할당 될 때 타입 정보를 유지한다
// typedef 를 사용하지 않은 케이스
class SortedCollection {
Function compare;
SortedCollection(int f(Object a, Object b)) {
compare = f;
}
}
// Initial, broken implementation.
int sort(Object a, Object b) => 0;
void main() {
SortedCollection coll = SortedCollection(sort);
// 타입 체크를 함수로 하고 있다는 것은 알고 있지만, 어떤 타입인지는 모른다
assert(coll.compare is Function);
}
- f 를 compare 에 할당하면 타입 정보가 손실된다
- f 의 타입은 (Object, Object) 이지만 compare 의 타입은 아직 Function 이다
- 명시적인 이름을 사용하고 타입 정보를 유지하도록 코드를 변경하면 개발자와 tools 모두 해당 정보를 사용할 수 있을 것이다
typedef Compare = int Function(Object a, Object b);
class SortedCollection {
Compare compare;
SortedCollection(this.compare);
}
// Initial, broken implementation.
int sort(Object a, Object b) => 0;
void main() {
SortedCollection coll = SortedCollection(sort);
assert(coll.compare is Function);
assert(coll.compare is Compare);
}
typedef Compare<T> = int Function(T a, T b);
int sort(int a, int b) => a - b;
void main() {
assert(sort is Compare<int>); // True!
}
3. Metadata
- 메타데이터를 사용하여 코드에 추가 정보를 정의할 수 있다
- 리플렉션을 사용하여 런타임에 메타데이터를 검색할 수 있다
- ex) @deprecated, @override 등
- todo.dart 라이브러리를 통해 @Todo() 를 작성할 수 있다
// todo library
library todo;
class Todo {
final String who;
final String what;
const Todo(this.who, this.what);
}
// Todo 사용 예제
import 'todo.dart';
@Todo('seth', 'make this do something')
void doSomething() {
print('do something');
}
4. Isolates
- 모바일 플랫폼에서도 대부분의 컴퓨터에는 멀티 코어 CPU가 있다
- 이러한 모든 코어를 활용하기 위해 개발자는 보통 동시에 실행되는 공유 메모리 스레드를 사용한다
- 그러나 shared-state 동시성은 에러가 발생하기 쉽고 복잡한 코드로 이어질 수 있다
- Dart 코드는 스레드 대신 격리된 내부에서 실행된다
- 각 격리에는 자체 메모리 힙이 있어서 다른 격리에서 격리 상태에 접근할 수 없다
- 참고
- Dart asynchronous programming: Isolates and event loops
- dart:isolate API reference, including Isolate.spawn() and TransferableTypedData
- Background parsing cookbook on the Flutter site
- Isolate sample app
'기타개발 > Flutter' 카테고리의 다른 글
Flutter 문서 링크 모음 (0) | 2020.09.13 |
---|---|
Flutter : StatefulWidget & StatelessWidget (0) | 2020.09.13 |
Dart #10 - Asychrony support, Generator (0) | 2020.08.28 |
Dart #9 : Library (1) | 2020.08.28 |
Dart #8 : Generics (0) | 2020.08.28 |
댓글