Dart (Flutter)

[Dart] Generator

llHoYall 2023. 2. 10. 21:55

Generator 역시 어제 오늘 등장한 내용은 아닌지라 아마 다들 알고 계실거라 생각합니다.

Keyword 역시 다른 언어들과 동일하게 yield를 사용합니다.

Generator를 사용하면, 요청될 때마다 현재 데이터를 반환 후 다음 데이터가 요청될 때까지 대기하게 됩니다.

간단하게만 살펴보도록 할게요.

Built-In Generator

Dart는 2가지 종류의 내장 generator를 제공합니다.

  • Synchronous Generator : Iterable object를 반환합니다.
  • Asynchronous Generator : Stream object를 반환합니다.
Iterable<int> syncNaturalsTo(int n) sync* {
  int k = 0;
  while (k < n) yield k++;
}

Stream<int> asyncNaturalsTo(int n) async* {
  int k = 0;
  while (k < n) yield k++;
}

with Recursion

재귀 호출과 함께 사용하여 성능 개선을 할 수 있습니다.

필요할 때 필요한 만큼의 데이터만 생성하기 때문에, lazy evaluation, dynamic allocation 등의 메모리 측면에서 효율적으로 사용을 할 수 있고, 재귀 호출을 이용하여 제어 흐름을 단순화하고 예측 가능하게 만들어 cache 사용 측면에서도 보다 효율적으로 사용할 수 있기 때문입니다.

Iterable<int> naturalsDownFrom(int n) sync* {
  if (n > 0) {
    yield n;
    yield* naturalsDownFrom(n - 1);
  }
}

Wrap Up

대량의 데이터를 다룰 때, 메모리 측면에서 효율적인 프로그래밍을 가능하게 만들어 주기 때문에 generator도 숙지하고 있어야 합니다.

문법적으로는 어려울 게 없고, 다른 언어들 통해서 이미 잘 알고 계시겠지만 개념적으로 잘 숙지하시길 바래요.