Future์ async/await - ๊ธฐ๋ค๋ฆฌ๋ ๋์ ์ฑ์ด ๋ฉ์ถ์ง ์๋ ์ด์
์ง๋ ๊ธ์์ ์ปฌ๋ ์ ์ ๋ค๋ค์ผ๋, ์ด๋ฒ์ Dart ์ธ์ด ๊ธฐ์ด์ ๋ง์ง๋ง, ๋น๋๊ธฐ๋ค. ์๋ฒ์์ ์ฌ์ฉ์ ์ด๋ฆ์ ๋ฐ์์ค๋ ํจ์๋ฅผ ๋ง๋ค๊ณ , ๋ฐ์์จ ๊ฐ์ ๋ฐ๋ก ์ถ๋ ฅํด๋ณด์. ์ฒ์์ ์ด๋ ๊ฒ ์ง๊ฒ ๋๋ค.
String fetchName() {
// ์๋ฒ์์ ๋ฐ์์ค๋ ๋ฐ 2์ด ๊ฑธ๋ฆฐ๋ค๊ณ ๊ฐ์
Future.delayed(Duration(seconds: 2), () => 'ํ๊ธธ๋');
return '???'; // ์ฌ๊ธฐ์ ๋งํ: ๊ฐ์ ์ด๋ป๊ฒ ๋๋ ค์ฃผ์ง?
}
void main() {
final name = fetchName();
print('์ด๋ฆ: $name'); // ์ด๋ฆ: ???
}2์ด ๋ค์ 'ํ๊ธธ๋'์ด ๋ง๋ค์ด์ง์ง๋ง, ํจ์๋ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ฐ๋ก ๋ค์ ์ค๋ก ๋์ด๊ฐ์ '???'๋ฅผ ๋๋ ค์ค๋ค. ์๋ฒ ์์ฒญ์ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋๋ฐ, ๊ทธ๋์ ์ฑ ์ ์ฒด๋ฅผ ๋ฉ์ถฐ ์ธ์ธ ์๋ ์์ผ๋ Dart๋ ๊ธฐ๋ค๋ฆฌ๋ ์์
์ ๋ค๋ก ๋ฏธ๋ค๋๊ณ ๋ค์ ์ฝ๋๋ฅผ ๋จผ์ ์คํํ๋ค. ๊ทธ๋์ "๊ฐ์ด ์์ง ์๋ ์ํ"๋ฅผ ํํํ ๋ฐฉ๋ฒ์ด ํ์ํ๋ค.
ํด๊ฒฐ: Future - "๋์ค์ ๊ฐ์ด ๋์ฐฉํ ๊ฒ"์ด๋ผ๋ ์ฝ์
Future<String> fetchName() {
return Future.delayed(Duration(seconds: 2), () => 'ํ๊ธธ๋');
}
void main() {
final name = fetchName();
print(name); // Instance of 'Future<String>'
}Future<String>์ "์ง๊ธ์ ๊ฐ์ด ์์ง๋ง, ๋์ค์ String์ด ๋์ฐฉํ๋ค"๋ ์ฝ์์ด๋ค. ์ง๋ ๊ธ์์ ๋ณธ ์์ ๋น์ ๋ก ํ๋ฉด, ์ด๋ฆํ๋ง ๋ถ์ ๋น ์์๊ฐ ๋จผ์ ์ค๊ณ , ๊ฐ์ ๋์ค์ ์ฑ์์ง๋ ์์๋ค. ๊ทธ๋์ print(name)์ ํ๋ฉด ๊ธ์๊ฐ ์๋๋ผ Instance of 'Future<String>'์ด ์ฐํ๋ค. ์์ง ์์๊ฐ ์ ์ด๋ฆฐ ์ํ๋ค.
์์๋ฅผ ์ด๋ ค๋ฉด: await
Future<String> fetchName() {
return Future.delayed(Duration(seconds: 2), () => 'ํ๊ธธ๋');
}
Future<void> main() async {
print('์์ฒญ ์์');
final name = await fetchName(); // ์ฌ๊ธฐ์ ๊ฐ์ด ๋์ฐฉํ ๋๊น์ง ๊ธฐ๋ค๋ฆผ
print('์ด๋ฆ: $name');
}์์ฒญ ์์
(2์ด ๋ค)
์ด๋ฆ: ํ๊ธธ๋await๋ "์ด Future์ ๊ฐ์ด ๋์ฐฉํ ๋๊น์ง ์ด ์ค์์ ๊ธฐ๋ค๋ ค๋ผ"๋ ๋ป์ด๋ค. ๊ทธ๋ฆฌ๊ณ await๋ฅผ ์ฐ๋ ํจ์์๋ ๋ ๊ฐ์ง๊ฐ ํ์ํ๋ค.
- ํจ์ ๋ชธํต ์์ **
async**๋ฅผ ๋ถ์ธ๋ค - ๋ฐํ ํ์
์ **
Future<...>**๋ก ๊ฐ์ผ๋ค (void๋ฉดFuture<void>)
async๋ฅผ ๋นผ๋จน๊ณ await๋ง ์ฐ๋ฉด The 'await' expression can only be used in an 'async' function. ์๋ฌ๊ฐ ๋๋ค.
"๊ธฐ๋ค๋ฆฐ๋ค"์ ์ง์ง ์๋ฏธ: ์ฑ์ด ๋ฉ์ถ๋ ๊ฒ ์๋๋ค
await์์ ๊ธฐ๋ค๋ฆฐ๋ค๊ณ ํด์ ์ฑ ์ ์ฒด๊ฐ ๋ฉ์ถ๋ ๊ฒ ์๋๋ค. ์์๋ฅผ ๋ณด๋ฉด ์ ์ ์๋ค.
Future<void> loadData() async {
print('2. ์์ฒญ ๋ณด๋');
await Future.delayed(Duration(seconds: 2));
print('4. ์๋ต ๋์ฐฉ');
}
Future<void> main() async {
print('1. ์์');
final future = loadData(); // await ์์ด ํธ์ถ
print('3. ๊ธฐ๋ค๋ฆฌ๋ ๋์ ๋ค๋ฅธ ์ผ');
await future;
}1. ์์
2. ์์ฒญ ๋ณด๋
3. ๊ธฐ๋ค๋ฆฌ๋ ๋์ ๋ค๋ฅธ ์ผ
4. ์๋ต ๋์ฐฉloadData()๊ฐ ๊ธฐ๋ค๋ฆฌ๋ 2์ด ๋์, ํธ์ถํ ์ชฝ์ 3. ๊ธฐ๋ค๋ฆฌ๋ ๋์ ๋ค๋ฅธ ์ผ์ ๋จผ์ ์คํํ๋ค. await๋ ๊ทธ ํจ์ ์์์๋ง ๊ธฐ๋ค๋ฆฌ๊ณ , ๊ทธ๋์ ๋ค๋ฅธ ์ฝ๋๊ฐ ๋์๊ฐ ์ ์๊ฒ ํด์ค๋ค. Flutter์์ ์๋ฒ ์๋ต์ ๊ธฐ๋ค๋ฆฌ๋ ์ค์๋ ํ๋ฉด์ด ๋ฉ์ถ์ง ์๊ณ ์คํฌ๋กค์ด ๋๋ ์ด์ ๊ฐ ์ด๊ฑฐ๋ค.
์๋ฌ ์ฒ๋ฆฌ: try / catch
Future<String> fetchName() async {
await Future.delayed(Duration(seconds: 1));
throw Exception('์๋ฒ ์ค๋ฅ');
}
Future<void> main() async {
try {
final name = await fetchName();
print(name);
} catch (e) {
print('์คํจ: $e'); // ์คํจ: Exception: ์๋ฒ ์ค๋ฅ
}
}await๋ฅผ ์ฐ๋ฉด ์ผ๋ฐ ์ฝ๋์ฒ๋ผ try/catch๋ก ์๋ฌ๋ฅผ ์ก์ ์ ์๋ค. ๋คํธ์ํฌ ์์ฒญ์ ์คํจํ ์ ์์ผ๋ ์ค๋ฌด์์๋ ๊ฑฐ์ ํญ์ ์ด ํํ๋ก ์ด๋ค.
Stream - ๊ฐ์ด ์ฌ๋ฌ ๋ฒ ๋์ฐฉํ๋ ๊ฒฝ์ฐ
Future๋ ๊ฐ์ด ๋ฑ ํ ๋ฒ ๋์ฐฉํ๋ค. ๊ฐ์ด ์ฌ๋ฌ ๋ฒ ๊ณ์ ๋์ฐฉํด์ผ ํ๋ฉด Stream์ ์ด๋ค. ์ฑํ
๋ฉ์์ง, ์ค์๊ฐ ์์น์ฒ๋ผ ์ด์ด์ ์ค๋ ๋ฐ์ดํฐ๋ค.
Stream<int> countDown() async* {
for (var i = 3; i >= 1; i--) {
await Future.delayed(Duration(seconds: 1));
yield i; // ๊ฐ์ ํ๋์ฉ ๋ด๋ณด๋
}
}
Future<void> main() async {
await for (final n in countDown()) {
print(n); // 3, 2, 1 ์ด 1์ด ๊ฐ๊ฒฉ์ผ๋ก ์ถ๋ ฅ
}
}async*์ yield๋ก ๊ฐ์ ํ๋์ฉ ๋ด๋ณด๋ด๊ณ , await for๋ก ํ๋์ฉ ๋ฐ๋๋ค. ์ง๊ธ์ "Future๋ ํ ๋ฒ, Stream์ ์ฌ๋ฌ ๋ฒ"์ด๋ผ๋ ์ฐจ์ด๋ง ๊ธฐ์ตํ๋ฉด ๋๋ค. Stream์ Flutter์ StreamBuilder์์ ๋ค์ ๋ง๋๋ค.
Kotlin๊ณผ ๋น๊ตํ๋ฉด
// Kotlin ์ฝ๋ฃจํด
suspend fun fetchName(): String {
delay(2000)
return "ํ๊ธธ๋"
}
fun main() = runBlocking {
val name = fetchName()
println("์ด๋ฆ: $name")
}Dart | Kotlin | |
๋์ค์ ๊ฐ์ด ์ค๋ ๊ฒ |
|
|
๋น๋๊ธฐ ํจ์ ํ์ |
|
|
๊ธฐ๋ค๋ฆฌ๊ธฐ |
| ํธ์ถํ๋ฉด ์๋์ผ๋ก ๊ธฐ๋ค๋ฆผ |
๊ฐ์ด ์ฌ๋ฌ ๋ฒ |
|
|
์ค๋ ๋ ๋ชจ๋ธ | ๋จ์ผ ์ค๋ ๋ ์ด๋ฒคํธ ๋ฃจํ | ์ฝ๋ฃจํด + ๋์คํจ์ฒ |
๊ฐ์ฅ ํฐ ์ฐจ์ด๋ ํธ์ถํ๋ ๋ชจ์์ด๋ค. Kotlin์ suspend ํจ์๋ ๊ทธ๋ฅ ํธ์ถํ๋ฉด ์์์ ๊ธฐ๋ค๋ฆฌ์ง๋ง, Dart๋ Future๋ฅผ ๋๋ ค์ฃผ๋ ํจ์๋ฅผ await ์์ด ํธ์ถํ๋ฉด ์์๋ง ๋ฐ๊ณ ๋์ด๊ฐ๋ค. ๊ทธ๋์ Dart์์๋ await๋ฅผ ๋นผ๋จน๋ ์ค์๊ฐ ํํ๋ค. Swift์ async/await์๋ ํค์๋๊น์ง ๊ฑฐ์ ๊ฐ๋ค.
์ ๋ฆฌ
- Dart๋ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ์์
์ ๊ธฐ๋ค๋ฆฌ๋๋ผ ๋ฉ์ถ์ง ์๊ณ , "๋์ค์ ๊ฐ์ด ๋์ฐฉํ๋ค"๋ ์ฝ์์ธ
Future<T>๋ฅผ ๋จผ์ ๋๋ ค์ค๋ค Future์ ๊ฐ์ ๊บผ๋ด๋ ค๋ฉดawait๋ฅผ ์ฐ๊ณ , ๊ทธ ํจ์์๋async๋ฅผ ๋ถ์ด๊ณ ๋ฐํ ํ์ ์Future<...>๋ก ๊ฐ์ผ๋คawait๋ ๊ทธ ํจ์ ์์์๋ง ๊ธฐ๋ค๋ฆฌ๊ณ , ์ฑ ์ ์ฒด๋ฅผ ๋ฉ์ถ์ง ์๋๋ค- ์คํจํ ์ ์๋ ์์ฒญ์
try/catch๋ก ๊ฐ์ธ์ ์๋ฌ๋ฅผ ์ฒ๋ฆฌํ๋ค - ๊ฐ์ด ํ ๋ฒ์ด๋ฉด
Future, ์ฌ๋ฌ ๋ฒ ์ด์ด์ ์ค๋ฉดStream์ด๋ค
๋ค์ ๊ธ๋ถํฐ๋ Dart ๋ฌธ๋ฒ์ ๋์ด 2๋จ๊ณ, ์์ ฏ๊ณผ ๋ ์ด์์์ ๋ค๋ค๋ณด๊ฒ ๋ค.
