본문 바로가기

CS/Flutter | Dart

Dart Asynchronous Programming - Future

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형으로 받고 싶다면 위 예시처럼 할 수 있음

 

 


Tiny Star