์คํธ๋ฆผ์ ๋ฐ์ดํฐ๋ ์ด๋ฒคํธ๊ฐ ๋ค์ด์ค๋ ํต๋ก๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
์ฑ์ ๋ง๋ค๋ค ๋ณด๋ฉด ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ผ์ด ๋ง์๋ฐ, ์ด๋ ํ์ด๋ฐ์ ๋ฐ์ดํฐ๊ฐ ๋ค์ด์ฌ์ง ํ์คํ ์๊ธฐ๊ฐ ์ด๋ ต๋ค.
์คํธ๋ฆผ์ ์ด์ ๊ฐ์ ๋น๋๊ธฐ ์์ ์ ํ ๋ ์ฃผ๋ก ์ฐ์ธ๋ค.
์๋ฅผ๋ค์ด ๋คํธ์ํฌ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ UI์ ๋ณด์ฌ์ฃผ๋ ์ํฉ์ ๊ฐ์ ํด๋ณธ๋ค๋ฉด,
์ธ์ ๋คํธ์ํฌ์์ ๋ฐ์ดํฐ๋ฅผ ๋ค ๋ฐ์์ง ์๊ธฐ ์ด๋ ต๋ค. ์ ํธ๊ฐ ์ฝํ ์์ดํ์ด๋ฅผ ์ธ ์๋ ์๊ณ , ๋นต๋นตํ ํต์ ์ ์ฐ๊ณ ์์ ์๋ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋ฐ ๋ฌธ์ ๋ฅผ ์คํธ๋ฆผ์ ๋ฐ์ดํฐ๋ฅผ ๋ง๋๋ ๊ณณ๊ณผ ์๋นํ๋ ๊ณณ์ ๋ฐ๋ก ๋ฌ์ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
Dart์ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ Future ๋ฐ Stream ํด๋์ค๋ก ์ฃผ๋ก ์ฒ๋ฆฌํ๋๋ฐ ์ด ๋์ ์ฐจ์ด์ ์ ์ดํด๋ณด๋ฉด
Future๋ ์ฆ์ ์๋ฃ๋์ง ์๋ ๊ณ์ฐ์ ๋ํ๋ธ๋ค. ์ผ๋ฐ ํจ์๊ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ๊ฒฝ์ฐ ๋น๋๊ธฐ ํจ์๋ Future๋ฅผ ๋ฐํํ๋ฉฐ ๊ฒฐ๊ณผ์ ํฌํจ๋๋ค. ๊ฒฐ๊ณผ๊ฐ ์ค๋น๋๋ฉด Future์ ์๋ ค์ฃผ๋ ๊ฒ์ด๋ค.
->future์ ์๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ์์ฒญ ํ ํ ์์ ํ ๊ฒฐ๊ณผ๊ฐ์ ๋ํด์ then()์ผ๋ก ์ ๋ฌ
->Stream์ ๊ตฌ๋
์ํจํด(๋๋ ๊ด์ฐฐ์ ํจํด)์ด๋ค. ๊ตฌ๋
์(listen)๊ฐ ๊ด์ฐฐ ๋์(stream)์ ๊ตฌ๋
ํ์ฌ ๊ด์ฐฐ ๋์์ ๋ณํ๊ฐ ๋ฐ์ํ๋ฉด ๊ตฌ๋
์์๊ฒ ๊ทธ ๋ณํ๋ฅผ ์๋ ค์ค๋ค.
๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์ข
๋ฅ์ ์คํธ๋ฆผ์๋ ๋ ํฐ ์ ์ฒด์ ์ผ๋ถ์ธ ์ผ๋ จ์ ์ด๋ฒคํธ๊ฐ ํฌํจ๋๋ค.
์ด๋ฒคํธ๋ ์ฌ๋ฐ๋ฅธ ์์๋ก ๋๋ฝ ์์ด ์ ๋ฌ๋์ด์ผ ํ๋ค.
ํ์ผ์ ์ฝ๊ฑฐ๋ ์น ์์ฒญ์ ๋ฐ์ ๋ ์ป๋ ์คํธ๋ฆผ. ์ด๋ฌํ ์คํธ๋ฆผ์ ํ ๋ฒ๋ง๋ค์ ์ ์๋ค.
๋์ค์ ๋ค์ ๋ฃ๋ ๊ฒ์ ์ด๊ธฐ ์ด๋ฒคํธ๊ฐ ๋๋ฝ๋์์์ ์๋ฏธํ ์ ์์ผ๋ฉฐ ๋๋จธ์ง ์คํธ๋ฆผ์ ์๋ฏธ๊ฐ ์๋ค.
์ฒญ์ทจ๋ฅผ ์์ํ๋ฉด ๋ฐ์ดํฐ๊ฐ ํ์น ๋์ด ์ฒญํฌ๋ก ์ ๊ณต๋๋ค.
ํ ๋ฒ์ ํ๋์ฉ ์ฒ๋ฆฌํ ์ ์๋ ๊ฐ๋ณ ๋ฉ์์ง๋ฅผ ์ํ ๊ฒ.
์ด๋ฌํ ์ข
๋ฅ์ ์คํธ๋ฆผ์ ์๋ฅผ ๋ค์ด ๋ธ๋ผ์ฐ์ ์์ ๋ง์ฐ์ค ์ด๋ฒคํธ์ ์ฌ์ฉ๋ ์ ์๋ค.
์ธ์ ๋ ์ง ์ด๋ฌํ ์คํธ๋ฆผ ์ฒญ์ทจ๋ฅผ ์์ํ ์ ์์ผ๋ฉฐ ์ฒญ์ทจํ๋ ๋์ ๋ฐ์ํ๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ค.
๋ ์ด์์ ๋ฆฌ์ค๋๊ฐ ๋์์ ๋ค์ ์ ์์ผ๋ฉฐ, ์ด์ ๊ตฌ๋
์ ์ทจ์ํ ํ ๋์ค์ ๋ค์๋ค์ ์ ์์ต๋๋ค.
์คํธ๋ฆผ์ ์ผ๋ จ์ ๋น๋๊ธฐ ์ด๋ฒคํธ
์์ฒญ ์ ๋ค์ ์ด๋ฒคํธ๋ฅผ ๋ฐ๋ ๋์ ์คํธ๋ฆผ์ด ์ค๋น๋๋ฉด ์ด๋ฒคํธ๊ฐ ์์์ ์๋ ค์ฃผ๋ ๋น๋๊ธฐ Iterable๊ณผ ๊ฐ๋ค.
๋ฆฌ์ค๋๋ฅผ ํ๋๋ง ์ ์ธํ๋ ๊ฒฝ์ฐ
import โdart:asyncโ;//ํจํค์ง๋ฅผ ๋ถ๋ฌ์ค๊ธฐ
void main() {
final controller = StreamController();
final stream = controller.stream // stream๊ฐ์ ธ์ค๊ธฐ
final streamListener1 = stream.listen((val){
print(โListener1 : $valโ); //Listener 1:1 โฆ 5 ๊น์ง ์ถ๋ ฅ
//๊ฐ์ ๋ฃ๊ณ ์๋ค๊ฐ ๋ค์ด์ค๋ฉด ์ด ํจ์๊ฐ ์คํ๋๋ค
});
controller.sink.add(1); //๊ฐ์ ์ ๋ฌ
controller.sink.add(2); //์ฌ๋ฌ๊ฐ์ ๊ฐ์ ์ ๋ฌํ ์ ์๋ค
controller.sink.add(3);
controller.sink.add(4);
controller.sink.add(5);
}
๋ฆฌ์ค๋๋ฅผ ์ฌ๋ฌ๊ฐ ์ ์ธํ๋ ๊ฒฝ์ฐ-๋ฆฌ์์ค๊ฐ ํ์ฉํ๋ ํ ๊ณ์ ์ ์ธํ ์ ์๋ค
import โdart:asyncโ;
void main() {
final controller = StreamController();
final stream = controller.stream
final streamListener1 = stream.listen((val){
print(โListener1 : $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);
}
์ด๋ ๊ฒ ๋ฐ๋ก ์คํํ๋ฉด ์๋จ
final stream = controller.stream //๊ธฐ๋ณธ์ ์ผ๋ก ๋ฆฌ์ค๋๋ฅผ ํ๋ฒ๋ง ์ ์ธ ํ ์ ์๋ ๋ฆฌ์์ค๊ฐ ์๊น
์ฌ๋ฌ๋ฒ ๊ณ์ ๋ฆฌ์ค๋์ ํ๊ณ ์ถ์ผ๋ฉด
final stream = controller.stream.asBroadcastStream();
์ด๋ ๊ฒ ๋ฐ๊ฟ์ค์ผํจ
import โdart:asyncโ;
void main() {
final controller = StreamController();
final stream = controller.stream.asBroadcastStream();
final streamListener1 = stream.listen((val){
print(โListener1 : $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
์ฆ์์์ Stream๊ฐ์ ๋ณ๊ฒฝํ๋ ๋ฒ-functional programming์ ๋๋ถ๋ถ ํจ์๋ค์ ์ฌ์ฉํ ์ ์๋ค
streamListener1์์๋ ์ง์๋ง ํ๋ฆฐํธํ๊ณ ,streamListener2์์๋ ํ์๋ง ํ๋ฆฐํธ ํ๋ ค๋ฉด?
import โdart:asyncโ;
void main() {
final controller = StreamController();
final stream = controller.stream.asBroadcastStream();
final streamListener1 = stream.where((val)=>val % 2 == 0).listen((val){
print(โListener1 : $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
functional programming์ฒ๋ผ ๋ฐ๋ก ๋ฐ์ดํฐ๊ฐ ๋ค์ด์ค๋ ์๊ฐ์ ๋ณํ์ ์ฃผ๊ฑฐ๋ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ์ ์๋ค.
ํจ์๋ก Stream์ ์ ๊ณตํ๋ ๋ฐฉ๋ฒ
import โdart:asyncโ;
void main() {
calculate(1).listen((val){
print(โcalculate(2) : $val โ);
}
Stream<int> calculate(int number)async*{
for (int i =0; i < 5; i+++){ // looping์ ํ๋ฉด์ calculate์ ๋ฃ์ด์ค ์ฒซ๋ฒ์งธ ํ๋ผ๋ฏธํฐ์ ๊ณฑํ๊ธฐ๋ฅผ ํ์ฌ ๊ณ์ฐ๋ ๊ฐ์ Looping์ ํ ๋ ๋ง๋ค ๋๋ ค์ค๊ฒ
yield i * number; //yield๊ฐ ์คํ์ด ๋ ๋๋ง๋ค calculateํจ์๋ฅผ ๋ฆฌ์ค๋ ํ๊ณ ์๋ ๋ฆฌ์ค๋์ ๊ฐ์ ๋ฟ๋ ค์ค ์ ์๋ค
}
}
//์ถ๋ ฅ๊ฐ
calculate(1) : 0
calculate(1) : 2
calculate(1) : 4
calculate(1) : 6
calculate(1) : 8
์ผ๋ฐ์ ์ธ Future์ ๊ด๋ จ๋ asyncํจ์๋ฅผ async*๋ก ๋ ํจ์์์ ์ฌ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ-await์ฌ์ฉ
import โdart:asyncโ;
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;
await Future.delayed(Duration(second: 1));
}
}
//๊ฐ์ด 1์ด๋ง๋ค ๊ณ์ฐ๋์ด ์ถ๋ ฅ๋๋ค
calculate(1) : 0
calculate(1) : 2
calculate(1) : 4
calculate(1) : 6
calculate(1) : 8
๐์ฐธ๊ณ ์๋ฃ