Study/Development
[개발일지] Dart 입문 4: Asynchronous Programming
titann
2022. 8. 21. 21:29

<인프런 코드팩토리 강의 수강일지>
1. Future
void main() {
// Future: 미래
// 미래에 받아올 값
Future<String> name = Future.value('코팩');
Future<int> number = Future.value(1);
Future<bool> isTrue = Future.value(true);
print('함수 시작');
// 2개의 파라미터
// delayed - 지연되다
// 1번 파라미터 - 지연할 기간 (얼마나 지연할 건지) Duration
// 2번 파라미터 - 지연 시간이 지난 후 실행할 함수
Future.delayed(Duration(seconds: 3), () {
print('Delay 끝'); // 함수 시작 후 3초 뒤에 실행된다.
});
}
void main() {
// Future: 미래
// 미래에 받아올 값
Future<String> name = Future.value('코팩');
Future<int> number = Future.value(1);
Future<bool> isTrue = Future.value(true);
addNumbers(1,1);
addNumbers(2,2);
}
void addNumbers(int num1, int num2) {
print('계산 시작: $num1 + $num2');
// 서버 시뮬레이션
Future.delayed(Duration(seconds: 2), () {
print('계산 완료: $num1 + $num2 ');
});
print('함수완료');
}
//계산 시작: 1 + 1
//함수완료 -> 기다리는 동안 다음 명령 시작
//계산 시작: 2 + 2 -> 기다리는 동안 다음 명령 시작
//함수완료 -> 기다리는 동안 다음 명령 시작
//계산 완료: 1 + 1 -> 2초 뒤 완료
//계산 완료: 2 + 2 -> 2초 뒤 완료
2. async - await
void main() {
addNumbers(1,1);
addNumbers(2,2);
}
void addNumbers(int num1, int num2) async {
print('계산 시작: $num1 + $num2');
// 서버 시뮬레이션
await Future.delayed(Duration(seconds: 2), () {
print('계산 완료: $num1 + $num2 = ${num1 + num2}');
});
// await 사용하여 시간 만큼 기다릴 수 있고, 다른 작업을 실행할 수 있다.
print('함수완료');
}
// 계산 시작: 1 + 1
// 계산 시작: 2 + 2
// 계산 완료: 1 + 1 = 2
// 함수완료
// 계산 완료: 2 + 2 = 4
// 함수완료
void main() async {
final result1 = await addNumbers(1, 1);
final result2 = await addNumbers(2, 2);
print('result1: $result1'); // 미래의 값
print('result2: $result2');
print('result1 + result2 = ${result1 + result2}');
}
Future<int> addNumbers(int num1, int num2) async {
print('계산 시작: $num1 + $num2');
// 서버 시뮬레이션
await Future.delayed(Duration(seconds: 2), () {
print('계산 완료: $num1 + $num2 = ${num1 + num2}');
});
// await 사용하여 시간 만큼 기다릴 수 있고, 다른 작업을 실행할 수 있다.
print('함수완료');
return num1 + num2; // return 하여 받아올 수 있음.
}
3. Stream
import 'dart:async'; // stream 사용 시 임포트
void main() {
final controller = StreamController();
final stream = controller.stream.asBroadcastStream();
//여러번 리스닝 가능
final streamListener1 = stream.where((val) => val % 2 == 0).listen((val) {
print('Listener 1 : $val'); // 짝수만 전달
});
final streamListener2 = stream.where((val) => val % 2 != 0).listen((val) {
print('Listener 2 : $val'); // 홀수만 전달
});
controller.sink.add(1); // listener에 값을 전달
controller.sink.add(2);
controller.sink.add(3);
controller.sink.add(4);
controller.sink.add(5);
}
// Listener 2 : 1
// Listener 1 : 2
// Listener 2 : 3
// Listener 1 : 4
// Listener 2 : 5
import 'dart:async';
void main() {
calculate(2).listen((val){
print('calculate(2): $val');
});
calculate(4).listen((val){
print('calculate(4): $val');
});
}
Stream<int> calculate(int number) async* {
for (int i = 0; i < 5; i++) {
yield i * number;
await Future.delayed(Duration(seconds:1)); // 비동기로 동시에 출력
}
}
// calculate(2): 0
// calculate(4): 0
// calculate(2): 2
// calculate(4): 4
// calculate(2): 4
// calculate(4): 8
// calculate(2): 6
// calculate(4): 12
// calculate(2): 8
// calculate(4): 16
//yield 마무리 후 다음 yield
import 'dart:async';
void main() {
playAllStream().listen((val) {
print(val);
});
}
Stream<int> playAllStream() async* {
yield* calculate(1); //yield*을 붙이면 함수 완료된 후 다음작업 실행
yield* calculate(1000); // await와 유사
}
Stream<int> calculate(int number) async* {
for (int i = 0; i < 5; i++) {
yield i * number;
await Future.delayed(Duration(seconds: 1)); // 비동기로 동시에 출력
}
}
// 0
// 1
// 2
// 3
// 4
// 0
// 1000
// 2000
// 3000
// 4000
반응형