본문 바로가기
Flutter

Dart 언어 Future 알아보기

by 봄석 2019. 11. 25.

Dart 언어  Future 알아보기

 

dart future에 대하여  자세히 알아보겠습니다.

dart dev의 내용을 한글로 번역한 글입니다.

https://dart.dev/codelabs/async-await

 

Asynchronous programming: futures, async, await

Learn about and practice writing asynchronous code in DartPad!

dart.dev

 

 

목차

Table of Contents

 

 

 

future란?

future는 비동기 작업의 결과를 나타내며 미완료(value를 생성하기 전)또는 완료(value 생성)의 두 가지 상태를 가질 수 있습니다.

 

- 미완성
비동기 함수를 호출하면 완료되지 않은 미래가 반환됩니다. 미래에는 함수의 비동기 작업이 완료되거나 오류가 발생하기를 기다리고 있습니다.

- 완료
비동기 작업이 성공하면 미래는 값으로 완료됩니다. 그렇지 않으면 오류와 함께 완료됩니다.

- 값으로 완성
유형의 미래는 유형 Future값으로 완료됩니다 T. 예를 들어, 유형이 미래인 Future경우 문자열 값이 생성됩니다. 미래가 유용한 가치를 창출하지 못하면 미래의 유형은 Future입니다.

- 오류와 함께 완료
함수가 수행하는 비동기 작업이 어떤 이유로 든 실패 하면 미래는 오류와 함께 완료됩니다.

 

 

비동기 작업이란?

비동기 작업은 다른 작업이 완료되기를 기다리는 동안 프로그램이 작업을 완료하도록 합니다. 일반적인 비동기 작업은 다음과 같습니다.

  • 네트워크를 통해 데이터를 가져 오는 중입니다.
  • 데이터베이스에 쓰기
  • 파일에서 데이터를 읽습니다.

Dart에서는 비동기 작업을 수행하기 위해 Future클래스와 async 및 await키워드를 사용할 수 있습니다.

 

 

 

비동기 작업을 잘못 사용한 예

String createOrderMessage () {
  var order = getUserOrder();
  return 'Your order is: $order';
}

Future<String> getUserOrder() {
  // Imagine that this function is more complex and slow
  return Future.delayed(Duration(seconds: 4), () => 'Large Latte');
}

main () {
  print(createOrderMessage());
}

기대하는 값은 getUserOrdr() 함수를 기다렸다가

'Your order is : Large Latte'라는 결과를 얻으려 합니다

하지만 실제 결과는 아래와 같습니다.

// result 
Your order is: Instance of 'Future<String>'

 

 

위 예제에서 getUserOrder() 결국 생성되는 값을 인쇄하지 못하는 이유입니다.

getUserOrder() 지연 후 사용자의 순서를 설명하는 문자열 인 "큰 라테"를 제공하는 비동기 함수입니다.
사용자의 주문을 받으려면 createOrderMessage() 전화를 걸어 주문 getUserOrder() 이 완료될 때까지 기다려야 합니다. 

완료를 기다리지 않기 때문에 결국 제공하는 문자열 값을 가져 createOrderMessage() 오지 못합니다.

 

 

 

Future Delayed 사용하기

다음 예에서는 getUserOrder() 콘솔로 인쇄한 후 완료되는 future를 반환합니다. 

사용 가능한 값을 반환하지 않으므로 getUserOrder() 유형은 Future <void>입니다.

 "Large Latte"또는 "Fetching user order..."중 어느 것이 먼저 인쇄되는지 예측해보시길 바랍니다.

 

Future<void> getUserOrder() {
  // Imagine that this function is fetching user info from another service or database
  return Future.delayed(Duration(seconds: 3), () => print('Large Latte'));
}

main() {
  getUserOrder();
  print('Fetching user order...');
}
//result
Fetching user order...
Large Latte

앞의 예에서, getUserOrder()에서 print() 호출 전에 실행되더라도 콘솔은 print()를 출력하기 전에 getUserOrder()( "큰 라테") 출력을 보여줍니다. getUserOrder()"큰 라테"를 인쇄하기 전에 지연되기 때문입니다.

 

 

오류와 함께 완료

Future<void> getUserOrder() {
// Imagine that this function is fetching user info but encounters a bug
  return Future.delayed(Duration(seconds: 3), () => throw Exception('Logout failed: user ID is invalid'));
}

main() {
  getUserOrder();
  print('Fetching user order...');
}

이 예에서는 getUserOrder() 사용자 ID가 유효하지 않음을 나타내는 오류와 함께 완료됩니다.

 

위의 예들에서 future와 future에 대해 알아보았지만?? 이런 비동기 함수의 결과들을 어떻게 사용해야 할까요??

아래에서 async 및 await키워드로 결과를 얻는 방법을 알아보겠습니다.

 

 

 

async , await

 

async및 await키워드는 비동기 함수를 정의하고 그 결과를 사용하는 선언적 방법을 제공합니다.

 

async : async함수 본문 앞에 키워드를 사용하여 비동기로 표시할 수 있습니다.
async function : async함수는 async 키워드로 표시된 함수입니다.
await : await키워드를 사용하여 비동기식의 완성된 결과를 얻을 수 있습니다. await키워드는 단지 async 내에서 작동하는 기능입니다.

 


다음 main()은 동기식 함수에서 비동기식 함수로 변환하는 예입니다.

// Asynchronous
Future<String> createOrderMessage() async {
  var order = await getUserOrder();
  return 'Your order is: $order';
}

Future<String> getUserOrder() {
// Imagine that this function is
// more complex and slow.
  return
    Future.delayed(
        Duration(seconds: 4), () => 'Large Latte');
}

// Asynchronous
main() async {
  print('Fetching user order...');
  print(await createOrderMessage());
}

//result
'Fetching user order...'
'Your order is: Large Latte'

 

 

 

 

delayed를 이용하여 비동기 함수 내에서 실행하기

void createOrderMessage () async {
  print('Awaiting user order...');
  var order = await getUserOrder();
  print('Your order is: $order');
}

Future<String> getUserOrder() {
  // Imagine that this function is more complex and slow.
  return Future.delayed(Duration(seconds: 4), () => 'Large Latte');
}

main() async {
  countSeconds(4);
  await createOrderMessage();
}

// You can ignore this function - it's here to visualize delay time in this example.
void countSeconds(s) {
  for( var i = 1 ; i <= s; i++ ) {
    Future.delayed(Duration(seconds: i), () => print(i));
  }
}
//result
Awaiting user order...
1
2
3
4
Your order is: Large Latte

 

댓글