Flutter
Flutter - Future , async , await
Mr. Joo
2023. 11. 6. 11:18
728x90
굳이 비동기 함수로 작성할 필요가 없지만 오직 비동기 함수 작성과 호출 문법을 설명하기 위한 예제이다.
- 동기 함수의 선언
int sum(int a, int b) {
return a + b;
}
- 비동기 함수의 선언
Future<int> sum(int a, int b) async {
return a + b;
}
- 동기 함수의 호출
void main() {
print(sum(1, 2));
}
- 비동기 함수의 호출 (await 키워드 사용)
Future<void> main() async {
final result = await sum(1, 2);
print(result);
}
- 비동기 함수의 호출 (Future - then() 메소드 절 사용)
Future<void> main() async {
sum(1, 2).then((result) {
print(result);
});
}
다트 공식 문서는 Future로 예외 처리하는 것보다 await 키워드 + try-catch 구문 조합을 권장한다.
Future
Future는 어떤 작업의 결과값을 나중에(Future) 받기로 약속(Promise) 받는 것 (다트에서는 Future를 쓰고 ES6에서는 Promise)
- Future는 패스트푸드점에서 주는 진동벨과 같다. 직원에게 주문 후 결제하면 진동벨을 받고 진동벨이 울릴 때까지 기다리면 음식을 받을 수 있다. 진동벨이 당장 받아야 하는 음식은 아니지만 언젠가(Future)는 음식을 준다는 약속(Promise)이다.
- 비동기 작업은 대체로 소요 시간이 길고 과정 중에 예기치 못한 에러 등으로 실패할 가능성도 있어 항상 어떤 타입의 결과를 보장 받지 못하므로 Future 타입으로 감싸게 된다.
- 비동기 함수 호출은 결과를 기다리지 않고 바로 다른 작업으로 넘어갈 수도 있다. 그 후 작업이 완료되면 결과를 받는 방식으로 비동기 처리한다.
- Future 상태
- Uncompleted
- Completed = data + error
예제 1: 미래에 void 반환을 약속
Future<void> doSomething() async {
print('I am done.');
}
void main() async {
doSomething().then((_) {});
}
가장 간단한 형태의 비동기 함수 doSomething은 미래에(Future) void로 아무 것도 반환하지 않는다.
하지만 모든 것이 객체인 다트에서 void와 null 또한 모두 객체이다.
따라서 함수를 호출하면서 then() 절에서 _ 밑줄을 쓴 것은 어떤 변수를 두어야 하나 그 값을 쓰지 않으므로 무시한다는 뜻이다. 실제로는 void 객체를 받지만 이는 쓸모가 없으므로 무시한 것이다.
예제 2: 미래에 String 데이터 반환을 약속
Future<String> doSomething() async {
return 'I am done.';
}
void main() async {
doSomething().then((data) {
print(data);
});
}
doSomething은 미래에 String 타입의 데이터 반환을 약속하기 위해 Future로 감쌌다. 그리고 실제로 작업이 완료되고 데이터는 then() 절의 매개변수로 접근이 가능하다.
예제 3: await 키워드로 결과값을 받기
Future<String> doSomething() async {
return 'I am done.';
}
void main() async {
final result = await doSomething();
print(result);
}
await 키워드를 사용해서 Future로 감싼 객체의 데이터를 받을 수도 있다.
공식 문서 튜토리얼 요약
문서 주요 내용을 요약한다.
잘못 쓴 비동기 코드
다음은 이후 설명을 위해 만든 잘못 작성된 코드이다.
String createOrderMessage() {
var order = fetchUserOrder();
return 'Your order is: $order';
}
Future<String> fetchUserOrder() =>
// 이 함수가 매우 복잡하고 느리다고 상상하자.
Future.delayed(
const Duration(seconds: 2),
() => 'Large Latte',
);
void main() {
print(createOrderMessage());
}
- main() 동기 함수에서 createOrderMessage() 동기 함수를 호출했으며 다시 시간이 오래 걸리는 fetchUserOrder() 동기 함수를 호출했다.
참고
728x90
LIST