본문 바로가기
기타개발/Flutter

Dart # 11 : Callable classes, Isolates, Typedefs

by 궝테스트 2020. 8. 28.

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

'기타개발 > 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

댓글