์ฐธ์กฐ ๊ฐ์
https://www.inflearn.com/course/dart-%EC%96%B8%EC%96%B4-%EC%9E%85%EB%AC%B8#curriculum
Functional Programmming
โ๏ธ์ค์ต์ฝ๋
void main() {
List<String> blackPink = ["๋ก์ ", "์ง์", "์ ๋", "๋ฆฌ์ฌ", "์ ๋"];
print(blackPink); //[๋ก์ , ์ง์, ์ ๋, ๋ฆฌ์ฌ, ์ ๋]
print(blackPink.asMap());//{0: ๋ก์ , 1: ์ง์, 2: ์ ๋, 3: ๋ฆฌ์ฌ, 4: ์ ๋}
print(blackPink.toSet());//{๋ก์ , ์ง์, ์ ๋, ๋ฆฌ์ฌ}
Map blackPinkMap = blackPink.asMap();
print(blackPinkMap.keys.toList());//[0, 1, 2, 3, 4]
print(blackPinkMap.values.toList());//[๋ก์ , ์ง์, ์ ๋, ๋ฆฌ์ฌ, ์ ๋]
Set blackPinkSet = blackPink.toSet();
print(blackPinkSet.toList());//[๋ก์ , ์ง์, ์ ๋, ๋ฆฌ์ฌ]
asMap์ ์ฌ์ฉํ๋ฉด map์ผ๋ก ํ๋ณํ์ ํด์ค๋ค. key๋ ๋ฆฌ์คํธ์ ์ธ๋ฑ์ค, value๋ ๋ฆฌ์คํธ์ ๊ฐ์ด๋ค. toSet()์ ์ด์ฉํ๋ฉด ๋ฆฌ์คํธ์์ ์ค๋ณต๋ ๊ฐ์ ์ ๊ฑฐํด์ฃผ๊ณ , set์ผ๋ก ํ๋ณํ์ ํด์ค๋ค. ()(Iterable) ํํ์์ ๋ฆฌ์คํธ๋ก ๋ง๋ค์ด ์ฃผ๊ธฐ ์ํด toList()๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
final newBlackPink = blackPink.map((x) {
return '๋ธ๋ํํฌ $x';
});
print(blackPink);// [๋ก์ , ์ง์, ์ ๋, ๋ฆฌ์ฌ, ์ ๋]
print(newBlackPink); //(๋ธ๋ํํฌ ๋ก์ , ๋ธ๋ํํฌ ์ง์, ๋ธ๋ํํฌ ์ ๋, ๋ธ๋ํํฌ ๋ฆฌ์ฌ, ๋ธ๋ํํฌ ์ ๋)
print(newBlackPink.toList());//[๋ธ๋ํํฌ ๋ก์ , ๋ธ๋ํํฌ ์ง์, ๋ธ๋ํํฌ ์ ๋, ๋ธ๋ํํฌ ๋ฆฌ์ฌ, ๋ธ๋ํํฌ ์ ๋]
final newBlackPink2 = blackPink.map((x) => '๋ธ๋ํํฌ $x');
print(newBlackPink2.toList()); //[๋ธ๋ํํฌ ๋ก์ , ๋ธ๋ํํฌ ์ง์, ๋ธ๋ํํฌ ์ ๋, ๋ธ๋ํํฌ ๋ฆฌ์ฌ, ๋ธ๋ํํฌ ์ ๋]
print(blackPink == blackPink); //true
print(newBlackPink == blackPink);//false
print(newBlackPink == newBlackPink2);//false
map ๋ฉ์๋๋ฅผ ํ์ฉํ์ฌ ๊ฐ ๋ฆฌ์คํธ์ ๋ฉค๋ฒ๋ฅผ ๋ฐ์ () iterable ํํ๋ก ๋ฐํํ ์ ์๋ค. toList()๋ฅผ ์จ์ ๋ฆฌ์คํธ๋ก ๋ณํ์์ผ์ฃผ๋ฉด ๋๋ค. newBlackPink2 ์ฒ๋ผ arrowํจ์ ํํ๋ ์ฌ์ฉ๋ ๊ฐ๋ฅํ๋ค. ์ด๋ newBlackPink์ newBlackPink2๋ ์ถ๋ ฅ ๊ฐ์ด ๊ฐ์ง๋ง, map์ ์ฌ์ฉํ๋ฉด ์๋ก์ด ๋ฆฌ์คํธ๋ก ๋ง๋ค์ด์ง๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋น๊ต๊ฐ์ด false๋ก ์ถ๋ ฅ๋๋ค.
Map<String, String> harryPotter = {
'harry potter': 'ํด๋ฆฌ ํฌํฐ',
'Ron Weasley': '๋ก ์์ฆ๋ฆฌ',
'Hermione Granger': 'ํค๋ฅด๋ฏธ์จ๋ ๊ทธ๋ ์ธ์ ',
};
final result = harryPotter.map((key, vaule) =>
MapEntry('Harry Potter Character $key', 'ํด๋ฆฌํฌํฐ ์บ๋ฆญํฐ $vaule'));
print(result);//{Harry Potter Character harry potter: ํด๋ฆฌํฌํฐ ์บ๋ฆญํฐ ํด๋ฆฌ ํฌํฐ, Harry Potter Character Ron Weasley: ํด๋ฆฌํฌํฐ ์บ๋ฆญํฐ ๋ก ์์ฆ๋ฆฌ, Harry Potter Character Hermione Granger: ํด๋ฆฌํฌํฐ ์บ๋ฆญํฐ ํค๋ฅด๋ฏธ์จ๋ ๊ทธ๋ ์ธ์ }
final keys = harryPotter.keys
.map(
(e) => 'HPC $e',
)
.toList();
final values = harryPotter.values.map((e) => 'ํด๋ฆฌํฌํฐ $e').toList();
print(keys); //[HPC harry potter, HPC Ron Weasley, HPC Hermione Granger]
print(values);// [ํด๋ฆฌํฌํฐ ํด๋ฆฌ ํฌํฐ, ํด๋ฆฌํฌํฐ ๋ก ์์ฆ๋ฆฌ, ํด๋ฆฌํฌํฐ ํค๋ฅด๋ฏธ์จ๋ ๊ทธ๋ ์ธ์ ]
final newSet = blackPinkSet
.map(
(e) => '๋ธ๋ํํฌ $e',
)
.toSet();
print(newSet);//{๋ธ๋ํํฌ ๋ก์ , ๋ธ๋ํํฌ ์ง์, ๋ธ๋ํํฌ ์ ๋, ๋ธ๋ํํฌ ๋ฆฌ์ฌ}
.where()์ map๊ณผ ์ ์ฌํ๋ฐ, ๊ดํธ ์์ ํจ์๋ฅผ ๋ฃ์ด ์๋ํ๋ค. ๋ฆฌ์คํธ ์์ ๋๋ฉด์ true๋ false๋ฅผ ๋ฐํํ๋ค. ์ด๋ true๋ฉด ์ ์งํ๊ณ false๋ฉด ์ ๊ฑฐํ๋ค. reduce๋ฅผ ์คํํ ๋ prev๋ ๋ฆฌํด๊ฐ(๋งจ ์ฒ์ ๊ฐ์ ์ฒซ๋ฒ์งธ value), next๋ ๋ค์๊ฐ์ด๋ค. ํ์ ์ ์ ์ํด์ผํ๋ค.
List<Map<String, String>> people = [
{
'name': '์ง์',
'group': '๋ธ๋ํํฌ',
},
{
'name': '๋ก์ ',
'group': '๋ธ๋ํํฌ',
},
{
'name': 'RM',
'group': 'BTS',
},
{
'name': 'V',
'group': 'BTS',
},
];
print(people); //[{name: ์ง์, group: ๋ธ๋ํํฌ}, {name: ๋ก์ , group: ๋ธ๋ํํฌ}, {name: RM, group: BTS}, {name: V, group: BTS}]
//-----------------------------------------------------------------------
final blackPinkPeople = people.where((e) => e['group'] == '๋ธ๋ํํฌ');
final bts = people.where((e) => e['group'] == 'BTS');
print(blackPinkPeople); //({name: ์ง์, group: ๋ธ๋ํํฌ}, {name: ๋ก์ , group: ๋ธ๋ํํฌ})
print(bts);//({name: RM, group: BTS}, {name: V, group: BTS})
List<String> words = ['์๋
ํ์ธ์ ', '์ ๋ ', '์ฝ๋ํฉํ ๋ฆฌ์
๋๋ค. '];
final sentence = words.reduce((prev, next) => prev + next);
final count = words.fold<int>(0, (prev, next) => prev + next.length);
print(sentence);//์๋
ํ์ธ์ ์ ๋ ์ฝ๋ํฉํ ๋ฆฌ์
๋๋ค.
print(count);//19
fold๋ reduce์ ๋ฌ๋ฆฌ ๋ฐํ๊ฐ์ด ์ ํด์ง ๊ฒ์ด ์๋๊ธฐ ๋๋ฌธ์ ์ ์ธํด์ฃผ์ด์ผ ํ๋ค. ์ฒ์ prev์๋ ์ ์ธํด์ค ๊ฐ์ด ๋๊ณ , next๋ ๋ฆฌ์คํธ์ ์ฒซ์งธ๊ฐ์ด ๋ค์ด๊ฐ๊ฒ ๋๋ค. ์๋ฌด ํํ๋ ๋ฆฌํดํ ์ ์๊ณ , ๋ฐ์ ์ค์ต์ฝ๋์ฒ๋ผ ๋ฆฌ์คํธ์ ๊ธธ์ด ๊ฐ์ ๊ตฌํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค.
void main() {
List<int> numbers = [1,3,5,7,9];
final sum = numbers.fold<int>(0,(prev,next)=>prev+next);
print(sum); //25
}
//______________________________________
List<String> words = ['์๋
ํ์ธ์ ', '์ ๋ ', '์ฝ๋ํฉํ ๋ฆฌ์
๋๋ค. '];
final count = words.fold<int>(0, (prev, next) => prev + next.length);
print(count);//19
๋ฆฌ์คํธ ์์ ...
์ ์จ์ฃผ๋ฉด ๋๊ดํธ([])๋ฅผ ์์ ์ค๋ค๊ณ ์๊ฐํ๋ฉด ์ฝ๋ค. ...ํ ๋ฆฌ์คํธ๋ ๊ธฐ์กด ๋ฆฌ์คํธ์๋ ๋ค๋ฅธ ๋ฆฌ์คํธ์ด๋ค.
List<int> even = [2, 4, 6, 8];
List<int> odd = [1, 3, 5, 7];
print([...even, ...odd]);//[2, 4, 6, 8, 1, 3, 5, 7]
print(even);//[2, 4, 6, 8]
print([...even]);//[2, 4, 6, 8]
print(even == [...even]);//false
ํด๋์ค๋ฅผ ํตํ JSON ๋ฐ์ดํฐ์ ์ ํํ๋ ์คํ ์์ , ์ ๊ฑฐ ๋ฑ ์์ ๋๋ฅผ ์ ํํ์ฌ ๋ฐ์ดํฐ์ ๊ตฌ์กฐ๋ฅผ ๋ฏฟ์ ์ ์๋ ์ํ๋ก ๋ง๋ค์ด ์ค ์ ์๋ค.
final parsedPeople =
people.map((x) => Person(name: x['name']!, group: x['group']!));
print(parsedPeople);
//(Person(name:์ง์,group:๋ธ๋ํํฌ), Person(name:๋ก์ ,group:๋ธ๋ํํฌ), Person(name:RM,group:BTS), Person(name:V,group:BTS))
class Person {
final String name;
final String group;
Person({
required this.name,
required this.group,
});
String toString() {
return 'Person(name:$name,group:$group)';
}
}
์ด๋ toString์ ์ฌ์ฉํ์ง ์์ผ๋ฉด ๊ฒฐ๊ณผ๊ฐ [Instance of 'Person', Instance of 'Person', Instance of 'Person', Instance of 'Person'] ์ด๋ฐ ์์ผ๋ก ๋์ค๊ธฐ ๋๋ฌธ์ ํด๋น ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ฃผ์ด์ผ ํ๋ค.
Async Programming
๐ก ๋๊ธฐ(synchronous)
ํน์ ์ฝ๋์ ์คํ์ด ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๊ณ ๋ ํ ๋ค์ ์ฝ๋๋ฅผ ์ํํ๋ ๊ฒ
์ค๊ณ๊ฐ ๊ฐ๋จํ๊ณ ์ง๊ด์ ์ด์ง๋ง ๊ฒฐ๊ณผ๊ฐ ์ฃผ์ด์ง ๋๊น์ง ์๋ฌด๊ฒ๋ ๋ชปํ๊ณ ๋๊ธฐํด์ผ ํ๋ค.
๐ก ๋น๋๊ธฐ(asynchronous)
ํน์ ์ฝ๋์ ์คํ์ด ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ค์ ์ฝ๋๋ค์ ์ํํ๋ ๊ฒ
๋๊ธฐ๋ณด๋ค ๋ณต์กํ์ง๋ง, ๊ฒฐ๊ณผ๊ฐ ์ฃผ์ด์ง๋ ๋์ ์์
์ ํ ์ ์์ด ์์์ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
CPU์์ ์์ ์ ์ฒ๋ฆฌํ ๋ ์์ ์ ์ฒ๋ฆฌํ๋ ๊ฐ์ฅ ์์ ์ ๋์ ๋จ์๋ ์ค๋ ๋์ด๋ค. ์๋ฅผ ๋ค์ด 1+1์ด๋ผ๋ ์์ (ํ๋์ ํจ์)์ ์คํํ๋ฉด ๊ทธ ๊ณ์ฐ์ CPU๊ฐ ๊ณ์ฐ์ ํด์ผํ ๊ฒ์ด๋ค. ๊ทธ ์์ ์ด ์๋ฃ๋๊ธฐ ์ ๊น์ง๋ CPU๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ์ด ์์ ์ด ์๋ฃ๋ ํ์์ผ ์์ ์ ์์ํ ์ ์์ ๊ฒ์ด๋ค. ๋ง์ฝ ์ฐ๋ฆฌ๊ฐ ์๋ฒ์์ฒญ์ ํด์ผํ๋ ์ํฉ์ ์๊ฐํด๋ณด์. ์๊ฐ๋ณด๋ค ๋ง์ ์๊ฐ์ด ๊ฑธ๋ฆด ์ ์๋ค. ์ปดํจํฐ์์ ์์ฒญ์ ๋ณด๋ด๊ณ , ๊ทธ ์๋ฒ์์ ์๋ต์ด ์ฌ๋๊น์ง ์๊ฐ์ ๋ญ๋นํด์ผํ ๊ฒ์ด๋ค. ์ด ๋นํจ์จ์ ์ธ ๊ณผ์ ์ ์์ Synchronous Programming์ด ์ด๋ํ๋ ๋จ์ ์ด๋ค. Asynchronous Programming์ ์๋ฒ ์์ฒญ์ ๋ณด๋ธ ์๊ฐ CPU๊ฐ ๋ค๋ฅธ ์์ ์ ๋ฐ์ ์ ์๋ ์ํ๊ฐ ๋์ด ๋ ํจ์จ์ ์ผ๋ก CPU๋ฅผ ์ฌ์ฉํ๊ณ ๋ญ๋นํ๋ ์๊ฐ์ ์ค์ผ ์ ์๋ค.
future๋ฅผ ์ฌ์ฉํด ๋ฏธ๋์ ๋ฐ์์ฌ ๊ฐ์ ์ ์ฅํ ์ ์๋ค. ๋ชจ๋ ํ์ ์ ๋ค future๋ก ๋ณ๊ฒฝ๊ฐ๋ฅํ๋ค. async programming์ด ๊ฐ๋ฅํ๊ฒ ํด์ฃผ๋ ๊ธฐ๋ฅ ์ค ํ๋์ธ future delayed๋ ๋ ๊ฐ์ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ๋๋ค. 1๋ฒ ํ๋ผ๋ฏธํฐ๋ ์ง์ฐ์ ํ๋ ์๊ฐ, 2๋ฒ ํ๋ผ๋ฏธํฐ๋ ์คํํ ํจ์๋ฅผ ๋ํ๋ธ๋ค.
Future<String> name = Future.value('์ฝ๋ํฉํ ๋ฆฌ');
Future<int> number = Future.value(1);
Future<bool> isTrue = Future.value(true);
addNumbers(1, 1);
}
void addNumbers(int a, int b) {
print('๊ณ์ฐ์ค : $a + $b');
Future.delayed(Duration(seconds: 2), () {
print("๊ณ์ฐ ์๋ฃ: $a+ $b = ${a + b}");
});
print('ํจ์ ์๋ฃ'); //2์ด ๊ธฐ๋ค๋ฆฌ๋ ๋์ ์คํ๋๋ ์ฝ๋.
์์ ์ฝ๋๋ฅผ ์คํ ์ํจ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์
๊ณ์ฐ์ค : 1 + 1
ํจ์ ์๋ฃ
(2s ๋ค)
๊ณ์ฐ ์๋ฃ: 1+ 1 = 2
ํจ์์๋ฃ๋ผ๋ ๋ฌธ๊ตฌ๋ ์ ์ผ ๋ค์ ์์ง๋ง, ๋๋ ์ด๋ ์ฝ๋๋ณด๋ค ๋จผ์ ์คํ๋๋ค, ๋๋ ์ด์ฝ๋๊ฐ ์คํ๋๋ค. CPU๊ฐ ์ผ์ ํ์ง ์๋ ์๊ฐ์ ๋ค๋ฅธ ์์ ์ ํ๋ ์ฝ๋๋ฅผ ์ง ๊ฒ์ด๋ค.
await๋ฅผ ์ฌ์ฉํ ํจ์๋ ๋ฌด์กฐ๊ฑด async ํจ์์ด์ด์ผ ํ๊ณ , async ํจ์๋ ๋ฌด์กฐ๊ฑด Future๋ฅผ ๋ฐํํด์ผ ํ๋ค await ํค์๋๋ฅผ ๋ง๋๋ฉด ํด๋น ํจ์๋ฅผ ์ ์ ์ ์งํ๊ณ , await ํค์๋๊ฐ ๋ถ์ ๋์์ด ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ๋ค.
Future<void> addNumbers(int a, int b) async {
print('๊ณ์ฐ์ค : $a + $b');
await Future.delayed(Duration(seconds: 2), () {
print("await ๊ณ์ฐ ์๋ฃ: $a+ $b = ${a + b}");
});
print('ํจ์ ์๋ฃ');
๊ณ์ฐ์ค : 2 + 2
await ๊ณ์ฐ ์๋ฃ: 2+ 2 = 4
ํจ์ ์๋ฃ
CPU๋ await ํ๋ ์ค์๋ ๋ค๋ฅธ ์์ ์ ํ ์๋ ์๋ค.
void main() {
Future<String> name = Future.value("์ฝ๋ํฉํ ๋ฆฌ");
Future<int> number = Future.value(1);
Future<bool> isTrue = Future.value(true);
addNumbers(1, 1);
addNumbers(2, 2);
}
void addNumbers(int number1, int number2) async {
print("๊ณ์ฐ์์: $number1 + $number2");
await Future.delayed(Duration(seconds: 2), () {
print("๊ณ์ฐ ์๋ฃ: $number1 + $number2 = ${number1 + number2}");
});
print("ํจ์์๋ฃ");
}
ํด๋น ์ฝ๋์์ addNumbers(2,2)๋ await ํจ์์์ ๋๊ธฐํ๋ ์ค์ ์คํ์ด ๋๋ค. ๋ง์ฝ ์ฌ๊ธฐ์ addNumbers(2,2)
์์๋ ๋๊ธฐ๋ฅผ ์ฃผ๊ณ ์ถ๋ค๋ฉด main๋ ์ ์ฌํ๊ฒ ๋ฐ๊พธ์ด์ฃผ๋ฉด ๋๋ค. async ์
๋ ฅ ํ Future<void> addNumbers~
์ด๋ฐ์์ผ๋ก ํจ์๋ฅผ Future๋ก ๊ฐ์ธ๋ ๋ค, addNumbers๋ฅผ main์์ ์ฌ์ฉ์ awai๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
void main() async {
Future<String> name = Future.value("์ฝ๋ํฉํ ๋ฆฌ");
Future<int> number = Future.value(1);
Future<bool> isTrue = Future.value(true);
await addNumbers(1, 1);
await addNumbers(2, 2);
}
Future<void> addNumbers(int number1, int number2) async {
print("๊ณ์ฐ์์: $number1 + $number2");
await Future.delayed(Duration(seconds: 2), () {
print("๊ณ์ฐ ์๋ฃ: $number1 + $number2 = ${number1 + number2}");
});
print("ํจ์์๋ฃ");
}
dart:async ๋ก importํด์จ ๋ค, StramController๋ก stream์ ํธ์ถํ๋ค. listen์ ํตํด listener์๊ฒ ๊ฐ๋ค์ ์ ๋ฌํ๋ค.
import "dart:async";
void main(){
final controller = StreamController();
final stream = controller.stream;
final streamListener1 = stream.listen((val){
print("Listener 1 : $val");
});
controller.sink.add(1);
controller.sink.add(2);
controller.sink.add(3);
controller.sink.add(4);
controller.sink.add(5);
}
Listener 1 : 1
Listener 1 : 2
Listener 1 : 3
Listener 1 : 4
Listener 1 : 5
์ปจํธ๋กค๋ฌ ์คํธ๋ฆผ์ ๊ฐ์ ธ์ค๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ํ๋ฒ ๋ฆฌ์ค๋์ ํ ์ ์๋ ๋ฆฌ์์ค๊ฐ ์๊ธด๋ค. ์ด๋ asBroadcastStream
์ด๋ผ๋ ํจ์๋ฅผ ๋ถ์ฌ์ฃผ๊ณ ์คํธ๋ฆผ์ BroadcastSream
์ผ๋ก ๋ณ๊ฒฝํด์ฃผ๋ฉด ๊ฐ๋จํ๊ฒ ์ฌ๋ฌ๋ฒ ๋ฆฌ์ค๋์ ํ ์ ์๋ ์คํธ๋ฆผ์ ๋ง๋ค ์ ์๋ค.
final controller = StreamController();
final stream = controller.stream.asBroadcastStream();
final streamListener1 = stream.listen((val) {
print("Listener 1 : $val");
});
final streamListener2 = stream.listen((val) {
print("Listener 2 : $val");
});
controller.sink.add(1);
controller.sink.add(2);
controller.sink.add(3);
controller.sink.add(4);
controller.sink.add(5);
Listener 1 : 1
Listener 2 : 1
Listener 1 : 2
Listener 2 : 2
Listener 1 : 3
Listener 2 : 3
Listener 1 : 4
Listener 2 : 4
Listener 1 : 5
Listener 2 : 5
์ฆ์์์ ๋ฐ์ดํฐ ์คํธ๋ฆผ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋๋ฐ, where
์ ์ฌ์ฉํด ๋ฐ๋ก ๋ฐ์ดํฐ๊ฐ ๋ค์ด์ค๋ ์๊ฐ์ ๋ณํ์ ์ฃผ๊ฑฐ๋ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ์ ์๋ค.
final controller = StreamController();
final stream = controller.stream.asBroadcastStream();
final streamListener1 = stream.where((val) => val % 2 == 0).listen((val) {
print("Listener 1 : $val");
});
final streamListener2 = stream.where((val) => val % 2 == 1).listen((val) {
print("Listener 2 : $val");
});
controller.sink.add(1);
controller.sink.add(2);
controller.sink.add(3);
controller.sink.add(4);
controller.sink.add(5);
Listener 2 : 1
Listener 1 : 2
Listener 2 : 3
Listener 1 : 4
Listener 2 : 5
ํจ์์์ return์ ํ๋ฉด ๊ฐ์ ๋ฐํํ๊ณ ์ข ๋ฃํ๋ค. ์คํธ๋ฆผ์ ๋๋ ค์ฃผ๊ณ ์ถ๋ค๋ฉด future<>๋ฅผ stream<>์ผ๋ก, async๋ฅผ async*๋ก, return์ yield๋ก ๋ณ๊ฒฝํ๋ฉด ๋๋ค.
void main() {
calculate(2).listen((val){
print("calculate(2) : $val");
});
}
Stream<int> calculate(int number) async* {
for(int i = 0; i < 5; i++) {
yield i * number;
}
}
calculate(2) : 0
calculate(2) : 2
calculate(2) : 4
calculate(2) : 6
calculate(2) : 8
async*์์๋ await ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
Stream<int> calculate(int number) async* {
for(int i = 0; i < 5; i++) {
yield i * number;
}
await Future.delayed(Duration(seconds : 3));
}
stream์ด ์คํ์ for ๋ฃจํ๊ฐ ์ข ๋ฃ๋ ๋ค 3์ด ํ์ ์ฝ๋๊ฐ ์ข ๋ฃ๋๋ค.
ํ ์คํธ๋ฆผ์ด ๋๋ ๋ค ๋ค์ ์คํธ๋ฆผ์ ์งํ์ํค๊ณ ์ถ๋ค๋ฉด, yield*
๋ฅผ ์ฌ์ฉํ๋ค. ์คํ์ ํด๋น ์คํธ๋ฆผ์ด ๋ชจ๋ ๊ฐ์ ๊ฐ์ ธ์จ ๋ค์ ์คํธ๋ฆผ์ด ์ข
๋ฃ๋๋ฉด, ๋ค์ ์คํธ๋ฆผ์ด ์งํ๋๋ค.
void main() {
playAllStream().listen((val){
print(val);
});
}
Stream<int> playAllStream() async* {
yield* calculate(1);
yield* calculate(1000);
}
Stream<int> calculate(int number) async* {
for(int i = 0; i < 5; i++) {
yield i * number;
}
await Future.delayed(Duration(seconds : 1));
}
0
1
2
3
4
0
1000
2000
3000
4000