Asynchronous Programming(비동기 프로그래밍)
:CPU를 훨씬 더 효율적으로 사용 가능
- 특정 코드의 처리가 완료되기 전, 처리하는 도중에도 계속 아래로 내려가며 수행하는 것
CPU Thread
thread: 작업하는 가장 작은 단위
void main() {
addNums(1, 2);
addNums(2, 3);
}
void addNums(int num1, int num2){
print("계산 중: $num1 + $num2");
print("계산 완료: ${num1 + num2}");
}
계산 중: 1 + 2
계산 완료: 3
계산 중: 2 + 3
계산 완료: 5
위 코드처럼 하면 절대 계산 중 다음에 계산 중이 올 수 없음
Future
미래에 받아올 값
2개의 파라미터
delayed(parameter1, parameter2);
parameter1: 지연할 기간(얼마나 지연할 건지) Duration
parameter2: 지연 시간이 지난 후 실행할 함수
void main() {
Future<String> name = Future.value('냥');
Future<int> number = Future.value(12);
Future<bool> isTrue = Future.value(true);
}
위와 같이 지정한 타입으로 받아올 수 있음
void main() {
print("함수 시작");
Future.delayed(Duration(seconds: 3), () {
print("Delay 끝");
});
}
함수 시작
Delay 끝
지정해 준 시간(3초) 후에 'Delay 끝' 출력
void main() {
addNums(3, 4);
addNums(5, 6);
addNums(7, 8);
}
void addNums(int num1, int num2){
print("계산 시작: ${num1 + num2}");
//서버 시뮬레이션
Future.delayed(Duration(seconds: 3), (){
print("계산 완료: $num1 + $num2 = ${num1 + num2}");
});
print("함수 완료");
}
계산 시작: 7
함수 완료
계산 시작: 11
함수 완료
계산 시작: 15
함수 완료
계산 완료: 3 + 4 = 7
계산 완료: 5 + 6 = 11
계산 완료: 7 + 8 = 15
서버가 있다고 가정하고 딜레이줬는데 계산 끝나길 기다리지 않고 다음 계산으로 넘어감
await
함수와 바디 사이에 'async'를 꼭 넣어줘야 사용 가능
void main() {
addNums(3, 4);
addNums(5, 6);
}
void addNums(int num1, int num2) async{
print("계산 시작: ${num1 + num2}");
//서버 시뮬레이션
await Future.delayed(Duration(seconds: 3), (){
print("계산 완료: $num1 + $num2 = ${num1 + num2}");
});
print("함수 완료: $num1 + $num2");
}
계산 시작: 7
계산 시작: 11
계산 완료: 3 + 4 = 7
함수 완료: 3 + 4
계산 완료: 5 + 6 = 11
함수 완료: 5 + 6
await는 현재 코드가 끝나기 전엔 다음 코드 실행하지 못하게 함
하지만 현재 코드가 끝나길 기다리는 동안 실행할 수 있는 코드를 실행(계산)
void main() async{
await addNums(3, 4);
await addNums(5, 6);
}
Future<void> addNums(int num1, int num2) async{
print("계산 시작: ${num1 + num2}");
//서버 시뮬레이션
await Future.delayed(Duration(seconds: 3), (){
print("계산 완료: $num1 + $num2 = ${num1 + num2}");
});
print("함수 완료: $num1 + $num2");
}
계산 시작: 7
계산 완료: 3 + 4 = 7
함수 완료: 3 + 4
계산 시작: 11
계산 완료: 5 + 6 = 11
함수 완료: 5 + 6
위 예시에서 '계산 시작' 부분도 순서대로 출력되게 하고 싶다면 main 함수에도 async 할 수 있는데,
await은 Future을 위해(?) 나온 거기 때문에 Future<void> addNums(int num1, int num2) 이렇게 Future로 만들어 줘야하고, main()의 addNums()앞에 await 붙여주면 됨
void main() async {
final res1 = await addNums(3, 4);
final res2 = await addNums(5, 6);
print("res1: $res1");
print("res2: $res2");
print("res1 + res2: ${res1 + res2}");
}
Future<int> addNums(int num1, int num2) async {
print("계산 시작: ${num1 + num2}");
//서버 시뮬레이션
await Future.delayed(Duration(seconds: 3), () {
print("계산 완료: $num1 + $num2 = ${num1 + num2}");
});
print("함수 완료: $num1 + $num2");
return num1 + num2;
}
계산 시작: 7
계산 완료: 3 + 4 = 7
함수 완료: 3 + 4
계산 시작: 11
계산 완료: 5 + 6 = 11
함수 완료: 5 + 6
res1: 7
res2: 11
res1 + res2: 18
return으로 int형으로 받고 싶다면 위 예시처럼 할 수 있음
'CS > Flutter | Dart' 카테고리의 다른 글
Dart 3.0 업데이트 주요 내용 - Record, Destructuring, pattern matching, mixin class (0) | 2023.07.13 |
---|---|
Dart Asynchronous Programming - Stream, yield (0) | 2023.07.12 |
Dart cascading operator, functional programming (0) | 2023.07.12 |
Dart Functional Programming - map, set, reduce, fold (1) | 2023.07.10 |
Dart 상속, static, interface, generic (0) | 2023.07.09 |