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도 숙지하고 있어야 합니다.
문법적으로는 어려울 게 없고, 다른 언어들 통해서 이미 잘 알고 계시겠지만 개념적으로 잘 숙지하시길 바래요.
'Dart (Flutter)' 카테고리의 다른 글
[Dart] Metadata (0) | 2023.02.11 |
---|---|
[Dart] Library (0) | 2023.02.10 |
[Dart] Asynchronous (0) | 2023.02.10 |
[Dart] Exception Handling (0) | 2023.02.09 |
[Dart] Generics (0) | 2023.02.08 |
댓글