- 동기 프로그래밍
: CPU가 하나의 작업을 하고 있을 경우, 다른 작업을 하지못함
--> 코드 순서대로 실행됨
- 비동기 프로그래밍
:CPU가 하나의 작업이 끝날 때까지 기다리는 동안 다른 작업을 할 수 있음
--> 코드 순서대로 실행되지 않음
4.1 비동기 프로그래밍(Asynchronous Programming)
- Future : 미래에 받아올 값 → 제네릭에 미래에 받아올 타입을 지정
ex) Future name = Future.value('코드팩토리'); 비동기적으로 실행
void main() {
// Future - 미래
// 미래에 받아올 값 → 제네릭에 미래에 받아올 타입을 지정하는 것임
Future<String> name = Future.value('코드팩토리');
Future<int> number = Future.value(1);
Future<bool> isTrue = Future.value(true);
print('함수 시작');
addNumbers(1, 1);
addNumbers(2, 2);
}
void addNumbers(int number1, int number2) {
print('계산 시작 : $number1 + $number2');
// 서버 시뮬레이션
// 2개의 파라미터
// delayed - 지연되다.
// 1번 파라미터 - 지연할 기간 (얼마나 지연할건지) Duration
// 2번 파라미터 - 지연 시간이 지난 후 실행할 함수
Future.delayed(Duration(seconds: 2), () {
print('계산 완료: $number1 + $number2 = ${number1 + number2}');
});
print('함수 완료: $number1 + $number2');
}
- await, async
비동기로 실행되는 곳에서 동기적으로 순서대로 실행하게끔 함
Future를 리턴하는 곳에서 사용가능함
await를 사용하기 위해 async를 함수정의시, 매개변수 뒤에 작성
--> 함수를 호출하는 경우에도 동기적으로 실행하게끔하려면
main함수에도 다른 함수들처럼 async을 작성해줌
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 number1, int number2) async {
print('계산 시작 : $number1 + $number2');
// 서버 시뮬레이션
await Future.delayed(Duration(seconds: 2), () {
print('계산 완료: $number1 + $number2 = ${number1 + number2}');
});
print('함수 완료: $number1 + $number2');
return number1+ number2;
}
4.2 스트링(Stream)
import 'dart:async'; 를 통해서 필요한 내용들을 불러온다 리스너를 등록줌으로써 스트림에 있는 값들이 실행되도록한다.
- where 함수
stream의 리스너 작성시, where함수로 필터링 가능 ex) final streamListener2 = stream.where((val)=> val % 2 == 1).listen((val){ print('Listener 2: $val'); });
import 'dart:async';
void main(){
final controller = StreamController();
final stream = controller.stream.asBroadcastStream();
// stream에 where함수로 필터링
//짝수 stream
final steramListener1 = stream.where((val)=> val % 2 == 0).listen((val){
print('Listener 1: $val');
});
// 홀수 stream
final streamListener2 = stream.where((val)=> val % 2 == 1).listen((val){
print('Listener 2: $val');
});
controller.sink.add(1);
controller.sink.add(2);
controller.sink.add(3);
controller.sink.add(4);
controller.sink.add(5);
}
- yield, async*
yield로 하나의 함수에서 여러값을 계속 반환할 수 있음
cf) return을 쓰는 경우 함수가 종료된다
함수로 스트림을 반환할 수 있음, async* 작성해줘야함 - yield*, async*
yield* 뒤에 있는 값들을 모두 반환한 뒤에 다음 코드가 실행됨
Stream을 await를 쓰는 것과 같은 효과를 줌
async*를 작성해줘야함
import 'dart:async';
void main(){
playAllStream().listen((val){
print(val);
});
}
// Stream을 await처럼 쓸 수 있게됨
Stream<int> playAllStream() async* {
yield* calculate(1);
yield* calculate(1000);
}
Stream<int> calculate(int number) async* {
for (int i =0; i< 5; i++){
yield i* number;
await Future.delayed(Duration(seconds: 1));
}
}
주의할 점
비동기 프로그래밍이기 때문에 코드 순서대로만은 실행되지 않기 때문에
코드 작성도 작성이지만, 실행 결과에 집중해서 공부할 필요가 있어보인다.
참고 자료
[코드팩토리] [입문] Dart 언어 4시간만에 완전정복 - Dart #4 Asynchoronous Programming 비동기 프로그래밍
'Group Study (2024-2025) > Flutter' 카테고리의 다른 글
[Flutter] 5주차 스터디_Widget State 이해하기 (0) | 2024.11.13 |
---|---|
[Flutter] 6주차 스터디_뽀모도로 앱 만들어보기 (1) | 2024.11.11 |
[Flutter] 4주차 스터디_UI 구성하기 (0) | 2024.10.29 |
[Flutter] 3주차 스터디_Flutter 시작하기 (8) | 2024.10.12 |
[Flutter] 1주차 스터디_함수형 프로그래밍 (Functional Programming) (11) | 2024.09.30 |