1. 비동기(async) 프로그래밍
1void main() {2addNumbers(1, 1);3addNumbers(2, 2);4}56void addNumbers(int num1, int num2) {7print('계산 중: ${num1 + num2}');8print('계산 완료: ${num1 + num2}');9}
1.1 Future.delayed
1void main() {2// Future - 미래에 받아올 값3Future<String> name = Future.value('홍길동');4Future<int> number = Future.value(1);5Future<bool> isTrue = Future.value(true);67print('함수 시작');89// delay - 지연되다10// 2개의 파라미터11// 1번 파라미터 : 지연할 기간 (얼마나 지연할건지) Duration12// 2번 파라미터 : 지연 시간이 지난 후 실행할 함수13Future.delayed(Duration(seconds: 2), () => {14print('2초 뒤에 실행됩니다.')15});16}
1.2 비동기 함수 예제
1void main() {2// Future - 미래에 받아올 값3Future<String> name = Future.value('홍길동');4Future<int> number = Future.value(1);5Future<bool> isTrue = Future.value(true);67addNumbers(1, 1);8addNumbers(2, 2);9}1011void addNumbers(int num1, int num2) {12print('계산 시작 : $num1 + $num2');1314// 서버 시뮬레이션15Future.delayed(Duration(seconds: 2), () => {16print('계산 완료 : $num1 + $num2 = ${num1 + num2}')17});1819print('함수 완료: $num1 + $num2');20}
2. async/await
- await는 future를 return해주는 함수만 사용 가능
1void main() async {2// Future - 미래에 받아올 값3Future<String> name = Future.value('홍길동');4Future<int> number = Future.value(1);5Future<bool> isTrue = Future.value(true);67await addNumbers(1, 1);8await addNumbers(2, 2);9}1011Future<void> addNumbers(int num1, int num2) async {12print('계산 시작 : $num1 + $num2');1314// 서버 시뮬레이션15await Future.delayed(Duration(seconds: 2), () => {16print('계산 완료 : $num1 + $num2 = ${num1 + num2}')17});1819print('함수 완료: $num1 + $num2');20}
2.1 future await 예제
1void main() async {2// Future - 미래에 받아올 값3Future<String> name = Future.value('홍길동');4Future<int> number = Future.value(1);5Future<bool> isTrue = Future.value(true);67final result1 = await addNumbers(1, 1);8final result2 = await addNumbers(2, 2);910print('result1: $result1');11print('result2: $result2');12print('result1 + result2 = ${result1 + result2}');13}1415Future<int> addNumbers(int num1, int num2) async {16print('계산 시작 : $num1 + $num2');1718// 서버 시뮬레이션19await Future.delayed(Duration(seconds: 2), () => {20print('계산 완료 : $num1 + $num2 = ${num1 + num2}')21});2223print('함수 완료: $num1 + $num2');2425return num1 + num2;26}
3. Stream
Future는 비동기적으로 하나의 값을 받아올 수 있는 객체Stream(개울)은 비동기적으로 여러개의 값을 받아올 수 있는 객체- 데이터가 계속 개울의 물처럼 흐름
- 사용자가 직접 닫기 전까지 무한하게 데이터를 받아올 수 있음
- 기본적으로 제공하는 패키지를 불러와서 Stream을 사용할 수 있음
1import 'dart:async';23void main() {4final controller = StreamController();5final stream = controller.stream;67final streamListener1 = stream.listen((val) {8print('Listener 1: $val');9});1011controller.sink.add(1);12controller.sink.add(2);13controller.sink.add(3);14controller.sink.add(4);15controller.sink.add(5);16}
3.1 stream을 여러번 listen하는 법
1import 'dart:async';23void main() {4final controller = StreamController();5final stream = controller.stream.asBroadcastStream(); // 여러번 listen 가능67final streamListener1 = stream.listen((val) {8print('Listener 1: $val');9});1011final streamListener2 = stream.listen((val) {12print('Listener 2: $val');13});1415controller.sink.add(1);16controller.sink.add(2);17controller.sink.add(3);18controller.sink.add(4);19controller.sink.add(5);20}
3.2 함수로 stream을 제공하는 법
1import 'dart:async';23void main() {4calculate(2).listen((val) {5print('calculate(2) : $val');6});78calculate(4).listen((val) {9print('calculate(4) : $val');10});11}1213Stream<int> calculate(int number) async* {14for (int i = 0; i < 5; i++) {15yield i * number;1617await Future.delayed(Duration(seconds: 1));18}19}
3.3 Stream await하는 법
1import 'dart:async';23void main() {4playAllStream().listen((val) {5print(val);6});7}89Stream<int> playAllStream() async* {10yield* calculate(1);11yield* calculate(1000);12}1314Stream<int> calculate(int number) async* {15for (int i = 0; i < 5; i++) {16yield i * number;1718await Future.delayed(Duration(seconds: 1));19}20}
102132435460710008200093000104000