인프런 커뮤니티 질문&답변

감사님의 프로필 이미지
감사

작성한 질문수

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

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

Future / async - await

해결된 질문

작성

·

632

·

수정됨

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'를 받을 수 있다는게 ....기본 강의를 돌려보아도 이해가 되지 않는데...좀 상세히 설명 해 주실 수 있을까요?

답변 8

0

감사님의 프로필 이미지
감사
질문자

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

0

감사님의 프로필 이미지
감사
질문자

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

 

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

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

코드팩토리님의 프로필 이미지
코드팩토리
지식공유자

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

0

감사님의 프로필 이미지
감사
질문자

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

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

코드팩토리님의 프로필 이미지
코드팩토리
지식공유자

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');
}
코드팩토리님의 프로필 이미지
코드팩토리
지식공유자

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()함수의 특징적인 기능이 있는 것일까요? 기본 개념이 양자적으로 이해해야 하는 것인지요?....

코드팩토리님의 프로필 이미지
코드팩토리
지식공유자

안녕하세요. 무슨말씀이신지 정확히는 모르겠으나 다트언어의 버그일리는 없을 것 같습니다. 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>'

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

 

코드팩토리님의 프로필 이미지
코드팩토리
지식공유자

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

print(createOrderMessage());

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

0

코드팩토리님의 프로필 이미지
코드팩토리
지식공유자

안녕하세요!

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

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

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

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

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

감사합니다.

감사님의 프로필 이미지
감사

작성한 질문수

질문하기