Flutter - Generators (제너레이터)

2023. 11. 7. 08:25·Flutter
728x90

Dart 의 generator 를 살펴보자.

generator 의 용도는

to lazily produce a sequence of values

코드상에서 선언된 순간에 바로 데이터가 처리되지 않고 실제로 사용할 때 데이터가 처리된다.

뒤늦게(실제 데이터가 필요할 때) 처리되는 방식은 동기식 과 비동기식이 있다.

둘 다 yield 를 통해 데이터를 전달하는데 return 과 다른점은 처리할 데이터가 있는 동안은 동작을 완료하지 않고 계속 수행하게 된다.

Synchronous

sync* 속성을 함수가 가지게 된다.

Iterable object 를 리턴한다.

import 'dart:io';

Iterable<int> generatorSync(int n) sync* {
	int k=0;
	while (k < n) {
		yield k++;
		sleep(Duration(seconds: 1));
	}
}

testGS(int n) {
	print('call generatorSync()');
	var gs = generatorSync(n);
	print('generatorSync() ends');
	for (var value in gs) {
		print(value);
	}
}

void main() {
	testGS(5);
}

output:

call generatorSync()
generatorSync() ends
0
1
2
3
4

위 예제를 보면 var gs = generatorSync(n); 코드에서 함수의 동작이 완료되고 모든 결과가 gs 변수에 저장되있을 것 처럼 보인다.

하지만 generatorSync() sync* 가 generator 이기 때문에 for (var value in gs) 에서 실제로 데이터를 처리하는 함수가 동작되어 결과적으로 1초마다 숫자가 출력되는 동작이 이루어 진다.

synchronous generator 의 리턴값은 결국 Iterable 이기 때문에 기본적인 Iterable 클래스 사용법의 차이는 없다.

testGS(int n) {
	print('call generatorSync()');
	var gs = generatorSync(n);
	print('generatorSync() ends');
	gs.forEach(print); // forEach method of Iterable
}

recursive call 도 지원하며 이때는 yield* 를 사용한다.

Iterable<int> generatorSync(int n) sync* {
    if (n > 0) {
        yield n;
        sleep(Duration(seconds: 1));
        yield* generatorSync(n - 1);
    }
}

Asynchronous

generator 동작을 비동기식으로 수행 한다.

async* 속성을 함수가 가지게 된다.

Stream object 를 리턴한다.

import 'dart:io';

Stream<int> generatorAsync(int n) async* {
	int k = 0;
	while (k < n) {
		yield k++;
		sleep(Duration(seconds: 1));
	}
}

testGAS(int n) {
	print('call generatorAsync()');
	generatorAsync(n).listen(print);
}

void main() {
	testGAS(5);
}
Future<int> downloadNothing(int n) async {
	return n;
}

Stream<int> generatorAsync(int n) async* {
	int k = 0;
	while (k < n) {
		yield await downloadNothing(k++);
		sleep(Duration(seconds: 1));
	}
}

recuresive call

Stream<int> generatorAsync(int n) async* {
	if (n > 0) {
		yield await downloadNothing(n);
		sleep(Duration(seconds: 1));
		yield* generatorAsync(n - 1);
	}
}

Reference

Dart Language Tour - Generator

Itarable class

728x90
LIST

'Flutter' 카테고리의 다른 글

Flutter - JWT  (1) 2023.11.07
Flutter - 동시성 , 병렬성 , 콜백함수  (0) 2023.11.07
Flutter - Timer  (1) 2023.11.06
Flutter - Future , async , await  (2) 2023.11.06
Flutter - pubspec.yaml  (1) 2023.11.02
'Flutter' 카테고리의 다른 글
  • Flutter - JWT
  • Flutter - 동시성 , 병렬성 , 콜백함수
  • Flutter - Timer
  • Flutter - Future , async , await
Mr. Joo
Mr. Joo
  • Mr. Joo
    삽질의 시작
    Mr. Joo
  • 전체
    오늘
    어제
    • 분류 전체보기 (178) N
      • Flutter (67)
      • Android (9)
      • Swift (4)
      • React (11)
      • 인공지능 (4)
      • CS (10)
      • 개발 뉴스 (70) N
      • IT 기기 (1)
      • 알면 유용한 정보 (2)
  • 인기 글

  • 태그

    뉴스 모음
    앱개발
    android
    DART
    앱
    Flutter
    개발 이슈
    개발 뉴스
    오늘의 뉴스
    Dart 기초
    오늘의 이슈
    이슈
    앱 개발
    기술 뉴스
    react
    Flutter 기초
    뉴스
    개발
    플러터
    기술
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.3
Mr. Joo
Flutter - Generators (제너레이터)
상단으로

티스토리툴바