inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

Dart #4 비동기 프로그래밍 (Async Programming)

Future / async - await

해결된 질문

832

감사

작성한 질문수 7

0

안녕하세요, 선생님.

기초적인 것 같은데 이해되지 않는 부분이 있어 질문드립니다.

다트 공식문서상에 있는 예제입니다.

 

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

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

Future<String> fetchUserOrder() async {
  return await Future.delayed(const Duration(seconds: 2), () => 'Large Latte');
}

결과:

Your order is Instance of 'Future<String>'

로직적으로 해석를 시도해보았고 다른 예제들도 실행하면 잘 되는데..이 예제만 궂이 main함수에 Future를 집어 넣어주야 'Large Latte'를 받을 수 있다는게 ....기본 강의를 돌려보아도 이해가 되지 않는데...좀 상세히 설명 해 주실 수 있을까요?

flutter 클론코딩 Flutter 클론코딩

답변 8

0

감사

끝까지 알려주셔서 감사합니다.....

0

감사

Future 사용시 return 값은 String이여도 await를 써 주지 않으면 리턴되지 않는 다는 것을 print()와 동일 선상에서 이해하려 했던 것 같습니다. 강조된 await에 이해하였습니다. 감사합니다.

 

"Future는 비동기 실행으로 반환 받을 수 있는 값을 이야기합니다.

await를 하지 않으면 비동기 실행이 끝날때까지 기다리지 않기때문에 미래에 받는 타입인 Future 타입이 그대로 반환됩니다."

0

코드팩토리

print()는 출력하려는 값을 파라미터에 입력하는 함수입니다. 함수에 await 하지 않은 반환값을 입력하셨으니 Future 타입이 출력되는게 맞습니다. await를 하면 Future가 벗겨진 타입을 반환받으니 예상하시는 결과가 나옵니다.

0

감사

위 두개의 코드의 main함수 내에서는 당연히 동기식이라 End 가 먼저 찍히는다는 것은 알고 있습니다...

다만 두개의 코드를 실행해 보면 print(addNumbers(1,1)) 담으면 결과값이 Instance of 'Future<String>'으로 나오는 것이 이해가 되지 않아 print() 의 특징 혹은 예외 같은내용이 있는지 궁금합니다. 혹은 제가 잘 이해를 하고 있는 못하는 것일까요?

0

코드팩토리

print(addNumbers(1,1))이 아니라 print(await addNumbers(1,1))을 실행하셔야합니다. 예외가 아니라 이미 말씀드린것처럼 Future 타입을 벗겨내려면 무조건 await를 하셔야합니다. 그 이유는 위에 설명드린바와 같습니다.

0

감사

void main()  {
  print('Start');
  addNumbers(1,1);
  print('End');
}
Future<void> addNumbers(int x, int y) async {
  print('addNumbers Start');
  final result = await Future.delayed(const Duration(seconds: 3), () {
    print('Waiting.......');
    return x + y;
  });
  print('addNumbers End');
  print('$x + $y = $result');
}

0

코드팩토리

end가 마지막에 실행되지 않는 이유는 addNumbers() 함수를 await 하지 않으셔서 그렇습니다. 이부분은 제 다트언어 비동기편에서도 다루고있으니 확인해주세요! 다트언어 버그는 절대 아닙니다.

0

감사

void main()  {
  print('Start');
  print(addNumbers(1,1));
  print('End');
}
Future<String> addNumbers(int x, int y) async {
  print('addNumbers Start');
  final result = await Future.delayed(const Duration(seconds: 3), () {
    print('Waiting.......');
    return x + y;
  });
  print('addNumbers End');
  return '$x + $y = $result';
}

0

감사

print(Object) vs Object의 차이가 있는 것 같습니다.

Object = function...

똑같은 코드에서 Object 내에서 print()로 Future<void> 형식으로 하면 잘 작동되나 Future<String> 같은 값으로 하면 전혀 작동하지 않습니다. Dart언어의 버그 같기도 하고 혹은 제가 알지 못하는 print()함수의 특징적인 기능이 있는 것일까요? 기본 개념이 양자적으로 이해해야 하는 것인지요?....

0

코드팩토리

안녕하세요. 무슨말씀이신지 정확히는 모르겠으나 다트언어의 버그일리는 없을 것 같습니다. print(Object)와 Object는 당연히 같지 않습니다. print()는 함수고 Object는 Object니까요. 예상하는대로 작동되지 않는 코드를 올려주시고 어떤부분이 어떻게 자독하길 예상하는지, 실제로 어떻게 작동하는지 말씀주시면 확인해보겠습니다.

0

감사

void main(){

print(createOrderMessage());

}

Future<String> createOrderMessage() async {

var order = await fetchUserOrder();

return 'Your order is $order';

}

Future<String> fetchUserOrder() async {

return await Future.delayed(const Duration(seconds: 2), () => 'Large Latte');

}

 

결과값: Instance of '_Future<String>'

이런결과가 나옵니다.....??-_-;;

 

0

코드팩토리

아 그 이유는 main() 함수에서도 await를 하셔야하기때문입니다. 이유는 위 설명드린바와 같습니다.

print(createOrderMessage());

물론 main 함수도 async로 설정하셔야합니다.

0

코드팩토리

안녕하세요!

질문을 정확하게 이해했는지 모르겠습니다.

하지만 현재 Your Order is Large Latte라는 결과값을 받고싶으시면 fetchUserOrder()를 await fetchUserOrder()로 변경하셔야합니다.

Future는 비동기 실행으로 반환 받을 수 있는 값을 이야기합니다.

await를 하지 않으면 비동기 실행이 끝날때까지 기다리지 않기때문에 미래에 받는 타입인 Future 타입이 그대로 반환됩니다.

await를 하게되면 비동기 작업이 끝날때까지 기다리기때문에 Future 타입을 벗겨낸 실제 타입, 즉 String 값을 받을 수 있습니다.

감사합니다.

198강 (){onTap(e);}의 이해 돕기

0

39

1

video_call 플러그인 설치후 에러 발생

0

47

1

SDK 안드로이드 설치 질문!

0

62

1

코드팩토리 디스코드 링크 다시 부탁드려요~

0

93

1

Webview를 이용해서 URL 상의 페이지 출력 불가

0

71

1

홈스크린 함수를 함축해서 main.dart에 옮기는 문제

0

56

1

플레이스토어

0

60

1

아고라 엔진 init 함수의 반환타입이 Future<void> 이것의 의미는 무엇인가요?

0

56

1

가이드라인 질문

0

59

0

emulator 에러 환경설정 뭐가 문제 일까요??

0

78

1

emulator 실행 오류

0

95

3

Column을 가로방향 최대 사이즈를 차지하도록 하는 방법에 관련

0

73

1

pubspec.yaml에서 font를 추가하면서 weight 값을 지정하는 것이 의미가 있는 것인지 문의

0

44

1

setState()를 호출하지 않으면 build가 실행 안되는 건가요?

0

54

1

video_call 플러그인 설치시 에러문제

0

67

1

children 안의 if 문에서 { } 못쓰는 이유?

0

51

1

이렇게 오류가 떠요

0

67

1

AppBar 사용했는데

0

63

2

[문제해결] '오늘도 출첵!' 의 171번 강의에서 중요한 문제를 발견했습니다

0

58

1

StatefulWidget 실습 에러가 발생합니다.[해결완료]

0

65

1

Video Player 프로젝트에 대한 추가 질문

0

54

0

Row위젯이나 column위젯의 위치는 누가 정하나요??

0

43

1

geolocator 오류때문에 개발진행이 불가능입니다

0

64

1

API 관련 이슈

0

89

2