🎉 berenickt 블로그에 온 걸 환영합니다. 🎉
Lang
Dart
04-비동기 프로그래밍

1. 비동기(async) 프로그래밍

1
void main() {
2
addNumbers(1, 1);
3
addNumbers(2, 2);
4
}
5
6
void addNumbers(int num1, int num2) {
7
print('계산 중: ${num1 + num2}');
8
print('계산 완료: ${num1 + num2}');
9
}

1.1 Future.delayed

1
void main() {
2
// Future - 미래에 받아올 값
3
Future<String> name = Future.value('홍길동');
4
Future<int> number = Future.value(1);
5
Future<bool> isTrue = Future.value(true);
6
7
print('함수 시작');
8
9
// delay - 지연되다
10
// 2개의 파라미터
11
// 1번 파라미터 : 지연할 기간 (얼마나 지연할건지) Duration
12
// 2번 파라미터 : 지연 시간이 지난 후 실행할 함수
13
Future.delayed(Duration(seconds: 2), () => {
14
print('2초 뒤에 실행됩니다.')
15
});
16
}

1.2 비동기 함수 예제

1
void main() {
2
// Future - 미래에 받아올 값
3
Future<String> name = Future.value('홍길동');
4
Future<int> number = Future.value(1);
5
Future<bool> isTrue = Future.value(true);
6
7
addNumbers(1, 1);
8
addNumbers(2, 2);
9
}
10
11
void addNumbers(int num1, int num2) {
12
print('계산 시작 : $num1 + $num2');
13
14
// 서버 시뮬레이션
15
Future.delayed(Duration(seconds: 2), () => {
16
print('계산 완료 : $num1 + $num2 = ${num1 + num2}')
17
});
18
19
print('함수 완료: $num1 + $num2');
20
}

2. async/await

  • await는 future를 return해주는 함수만 사용 가능
1
void main() async {
2
// Future - 미래에 받아올 값
3
Future<String> name = Future.value('홍길동');
4
Future<int> number = Future.value(1);
5
Future<bool> isTrue = Future.value(true);
6
7
await addNumbers(1, 1);
8
await addNumbers(2, 2);
9
}
10
11
Future<void> addNumbers(int num1, int num2) async {
12
print('계산 시작 : $num1 + $num2');
13
14
// 서버 시뮬레이션
15
await Future.delayed(Duration(seconds: 2), () => {
16
print('계산 완료 : $num1 + $num2 = ${num1 + num2}')
17
});
18
19
print('함수 완료: $num1 + $num2');
20
}

2.1 future await 예제

1
void main() async {
2
// Future - 미래에 받아올 값
3
Future<String> name = Future.value('홍길동');
4
Future<int> number = Future.value(1);
5
Future<bool> isTrue = Future.value(true);
6
7
final result1 = await addNumbers(1, 1);
8
final result2 = await addNumbers(2, 2);
9
10
print('result1: $result1');
11
print('result2: $result2');
12
print('result1 + result2 = ${result1 + result2}');
13
}
14
15
Future<int> addNumbers(int num1, int num2) async {
16
print('계산 시작 : $num1 + $num2');
17
18
// 서버 시뮬레이션
19
await Future.delayed(Duration(seconds: 2), () => {
20
print('계산 완료 : $num1 + $num2 = ${num1 + num2}')
21
});
22
23
print('함수 완료: $num1 + $num2');
24
25
return num1 + num2;
26
}

3. Stream

  • Future는 비동기적으로 하나의 값을 받아올 수 있는 객체
  • Stream(개울)은 비동기적으로 여러개의 값을 받아올 수 있는 객체
    • 데이터가 계속 개울의 물처럼 흐름
    • 사용자가 직접 닫기 전까지 무한하게 데이터를 받아올 수 있음
    • 기본적으로 제공하는 패키지를 불러와서 Stream을 사용할 수 있음
1
import 'dart:async';
2
3
void main() {
4
final controller = StreamController();
5
final stream = controller.stream;
6
7
final streamListener1 = stream.listen((val) {
8
print('Listener 1: $val');
9
});
10
11
controller.sink.add(1);
12
controller.sink.add(2);
13
controller.sink.add(3);
14
controller.sink.add(4);
15
controller.sink.add(5);
16
}

3.1 stream을 여러번 listen하는 법

1
import 'dart:async';
2
3
void main() {
4
final controller = StreamController();
5
final stream = controller.stream.asBroadcastStream(); // 여러번 listen 가능
6
7
final streamListener1 = stream.listen((val) {
8
print('Listener 1: $val');
9
});
10
11
final streamListener2 = stream.listen((val) {
12
print('Listener 2: $val');
13
});
14
15
controller.sink.add(1);
16
controller.sink.add(2);
17
controller.sink.add(3);
18
controller.sink.add(4);
19
controller.sink.add(5);
20
}

3.2 함수로 stream을 제공하는 법

1
import 'dart:async';
2
3
void main() {
4
calculate(2).listen((val) {
5
print('calculate(2) : $val');
6
});
7
8
calculate(4).listen((val) {
9
print('calculate(4) : $val');
10
});
11
}
12
13
Stream<int> calculate(int number) async* {
14
for (int i = 0; i < 5; i++) {
15
yield i * number;
16
17
await Future.delayed(Duration(seconds: 1));
18
}
19
}

3.3 Stream await하는 법

1
import 'dart:async';
2
3
void main() {
4
playAllStream().listen((val) {
5
print(val);
6
});
7
}
8
9
Stream<int> playAllStream() async* {
10
yield* calculate(1);
11
yield* calculate(1000);
12
}
13
14
Stream<int> calculate(int number) async* {
15
for (int i = 0; i < 5; i++) {
16
yield i * number;
17
18
await Future.delayed(Duration(seconds: 1));
19
}
20
}
1
0
2
1
3
2
4
3
5
4
6
0
7
1000
8
2000
9
3000
10
4000