[RxJava] 4. Reactive ์ฐ์ฐ์ ํํค์ณ๋ณด๊ธฐ 2ํธ (๊ฒฐํฉ, ์กฐ๊ฑด ์ฐ์ฐ์)
์ด๋ฒ ํฌ์คํธ๋ ์ง๋ ํฌ์คํธ์ ์ด์ด ๊ฒฐํฉ, ์กฐ๊ฑด ์ฐ์ฐ์์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
๊ฒฐํฉ ์ฐ์ฐ์
๊ฒฐํฉ ์ฐ์ฐ์๋ ์ฌ๋ฌ ๊ฐ์ Observable ๊ฐ์ฒด๋ฅผ ์กฐํฉํ์ฌ ํ์ฉํ๋ ์ฐ์ฐ์๋ก ๋ค์์ Observable์ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์ ํ๋์ Observable๋ก ๋ง๋ค์ด์ฃผ๋ ์ฐ์ฐ์๋ค์ ๋งํฉ๋๋ค.
zip()
๋จผ์ ์ฒซ ๋ฒ์งธ๋ก zip ์ฐ์ฐ์๊ฐ ์์ต๋๋ค. zip ์ฐ์ฐ์๋ ๋ ๊ฐ ์ด์์ Observable ๊ฐ์ฒด๋ฅผ ์ด์ฉํ์ฌ ํ๋์ ObservableSource๋ก ๊ฒฐํฉํด์ฃผ๋ ์ฐ์ฐ์์ธ๋ฐ, ์ด ์ฐ์ฐ์์๋ ๋ค์ ์๋ฌธ์ ์ด ์์ต๋๋ค.
๋ ๋ฐ์ดํฐ๊ฐ ๋ฐํ๋๊ธฐ ์ ์ ์ํ๋ผ๋ฉด ์ด๋จ๊น์? ๋ฐ์ดํฐ๊ฐ ๋ฐํ๋์ง ์์ ์ํ๋ผ๋ฉด ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผํฉ๋๋ค. zip ์ฐ์ฐ์๋ ๋ ์ฐ์ฐ์ ์ค ํ๋์ ์ฐ์ฐ์๋ผ๋ ๋ฐํ๋ ์ํ๊ฐ ์๋๋ผ๋ฉด ๋ฐ์ดํฐ๊ฐ ๋ฐํ๋ ๋๊น์ง ๋๊ธฐํฉ๋๋ค.
zip ์ฐ์ฐ์๋ ์ต๋ 9๊ฐ์ Observable์ ๊ฒฐํฉํ ์ ์์ต๋๋ค.
Disposable disposable = Observable.zip(
Observable.just(300, 600, 900),
Observable.just(30, 60, 90),
Observable.just(3, 6, 9),
(x, y, z) -> x + y + z
).subscribe(System.out::println);
disposable.dispose();
๋ค์์ ๋ฐ์ดํฐ๊ฐ ๋ค์ด ์๋ Observable ๊ฐ์ฒด๋ฅผ ๊ฒฐํฉํ ๋๋ ๊ฐ๊ฐ์ ์ธ์์ ๋ง๊ฒ ๊ฒฐํฉ๋๋ฉฐ ์ด๋ฅผ ๊ฒฐํฉํ ๋ ์ฌ์ฉํ ์ฐ์ฐ์ lambda๋ก ์ ์ํ ์ ์์ต๋๋ค.
๋น์ทํ ์ฐ์ฐ์๋ก zipWith๊ฐ ์์ต๋๋ค.
๊ธฐ๋ณธ ๊ณจ๊ฒฉ์ zip ์ฐ์ฐ์์ ๊ฐ์ง๋ง ๊ธฐ์กด์ ๋ฐํ๋ ๋จ์ผ Observable ๊ฐ์ฒด์์ ๋๋ค๋ฅธ zip ์ฐ์ฐ์ ์ทจํ๊ณ ์ ํ๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํฉ๋๋ค. ๊ฐ๋ น ์๋ฅผ ๋ค์ด์ ์๋์ ๊ฐ์ด ์ฌ์ฉํ ์ ์์ต๋๋ค.
Disposable dp = Observable.just(300, 600, 900).zipWith(
Observable.just(30, 60, 90), (x, y) -> x * y
).subscribe(System.out::println);
์ธ์๊ฐ ObservableSource๋ก ํ๋์ ์ฐ์ฐ์ด ๋ค์ด๊ฐ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ฌ๋ฌ ๊ฐ์ Observable์ ๊ฒฐํฉํ๊ณ ์ ํ๋ ๊ฒฝ์ฐ ObservableSource๋ก ๊ฒฐํฉํ ๋ค์, zipWith๋ฅผ ์ฌ์ฉํ์ฌ ํ๊บผ๋ฒ์ ๊ฒฐํฉํ ์ ์์ต๋๋ค.
Disposable disposable = Observable.zip(
Observable.just(300, 600, 900),
Observable.just(30, 60, 90),
Observable.just(3, 6, 9),
(x, y, z) -> x + y + z
).zipWith(Observable.just(0, 0, 0), (xyz, z) -> xyz * z).subscribe(System.out::println);
์์์ zip ์ฐ์ฐ์๋ก ๊ฒฐํฉํ ObservableSource ๊ฐ์ ์ด์ด์ zipWith๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฐํฉํ๋ฉด ์ด๋ฅผ ํ ๋ฒ์ ์กฐํฉํ ๋ค ๋ค์์ ์ ํด์ง ๊ฒฐํฉ ๋ฐ์ดํฐ๋ก ๋๋ถ์ด ๊ฒฐํฉ์ด ๊ฐ๋ฅํฉ๋๋ค.
combineLatest()
zip ์ฐ์ฐ์๊ฐ ๋ฐ์ดํฐ์ ๋ฐํ์ด ์ด๋ค์ง ๋๊น์ง ๊ธฐ๋ค๋ ธ๋ค ๊ฐ๊ฐ์ Observable ๊ฐ์ฒด ๋ด ๋ฐ์ดํฐ๋ฅผ ๊ฒฐํฉํด์ฃผ๋ ์ฐ์ฐ์์๋ค๋ฉด combineLatest ์ฐ์ฐ์๋ 2๊ฐ ์ด์์ Observable ๊ฐ์ฒด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ๊ธฐ ๊ฐ์ด ๋ณ๊ฒฝ๋์์ ๋ ์ด๋ฅผ ๊ฐฑ์ ํด์ฃผ๋ ์ฐ์ฐ์์ ๋๋ค.
์ฝ๋๋ฅผ ์๋ณด๋ฉด ๋ง์ง๋ง ์ฐ์ฐ์์ combiner๊ฐ ๋ค์ด๊ฐ๋๋ค. ์ด๋ zip ์ฐ์ฐ์์์ zipper์ ๋์ผํ ์ญํ ์ ํ๋ Lambda ํจ์๋ผ๋ ๊ฒ์ ์ ์ ์์ผ๋ฉฐ ๋ Observable์ ๊ฒฐํฉํ์ฌ ์ด๋ค Observable์ ๋ง๋ค์ด ์ฃผ๋๋ก ํฉ๋๋ค.
zip ์ฐ์ฐ์์ ๋ค๋ฅธ ์ ์ zip ์ฐ์ฐ์๋ ํ ๋ฒ ๋ฐ์ดํฐ๊ฐ ๋ฐํ๋๋ฉด ๊ทธ ์ดํ๋ก zipper ํจ์๋ ๋์ํ์ง ์์ง๋ง combineLatest๋ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค combiner ํจ์๋ฅผ ์ฌ์คํํ๊ธฐ ๋๋ฌธ์ ์์๋ก ๋ฐ์ดํฐ๊ฐ ๋ณ๋๋์์ ๋์ ์ด๋ฒคํธ๋ฅผ ๋ง๋ค๊ณ ์ ํ ๋ ์ ๋ฆฌํฉ๋๋ค.
๋จ, ์๋ฌด๋ ๋ฐ์ดํฐ๊ฐ ๋ฐํ๋์ง ์์ ์ํ์์ ํ ๊ฐ์ Observable์์๋ง ๋ฐ์ดํฐ๊ฐ ๋ฐํ๋๋ค๊ฑฐ๋ ๋ ๋ค๋ฅธ ํ ๊ฐ์ Observable์์๋ง ๋ฐ์ดํฐ์ ๋ณํ๊ฐ ์๊ธด๋ค๋ฉด ๊ทธ ๋๋ ์ด ์ฐ์ฐ์ด ์ํ๋์ง ์์ต๋๋ค. ์ต์ ๋ ๊ฐ์ด ๋ชจ๋ ๋ฐํ๋ ์ํ์์ ์ฐ์ฐ์ด ์์๋๋ฉฐ ๊ทธ ํ์๋ ์ด๋ Observable ์์๋ ์ง ์ฌ๋ฐํ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ๋ฐ์ดํฐ๋ฅผ ๊ฐฑ์ ํ๊ฒ ๋ฉ๋๋ค.
์ต๋ 9๊ฐ์ Observable ๊ฐ์ฒด๋ฅผ ๋ฃ์ ์ ์์ผ๋ฉฐ 2๊ฐ์ ์ธ์์ Observable์ ๊ฐ๊ฐ ๋ฃ๊ณ combiner์ ์ํ๋ ์ฐ์ฐ์ ๊ตฌํํ๋ฉด ๋ฉ๋๋ค.
merge()
merge ์ด๋ฆ ์์ฒด๋ ๊ฒฐํฉ ์ฐ์ฐ์์ธ ๊ฒ์ด ๋ณด์ด์ง๋ง zip๊ณผ combineLatest์๋ ๋ค์ ์ฐจ์ด๊ฐ ์์ต๋๋ค. ๊ฒฐํฉ์ ์ํด์๋ ๋จ์ผ Observable์ด ์๋ ๋ ๊ฐ ์ด์์ Observable์ ๋ฃ์ด์ผ ํฉ๋๋ค. ๊ทธ๋ฐ๋ฐ merge ์ฐ์ฐ์๋ ์์๋ ๋ฐ์ดํฐ ๋ฐํ ์ฌ๋ถ์ ๊ด๊ณ ์์ด UpStream์์ ๋จผ์ ์ ๋ ฅ๋๋ ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋๋ก ๋ฐํํฉ๋๋ค.
๋ฉ์๋ ์ธ์๋ฅผ ๋ณด๋ฉด ํ ๊ฐ์ง ๋ ์ฐจ์ด๋ฅผ ๋ณผ ์ ์์ต๋๋ค. combineLatest์ zip์ ๊ฒฝ์ฐ ๊ฒฐํฉํ ๋ ์ค๊ฐ ์ฐ์ฐ์ ์ํํ ์ ์๋๋ก zipper, combiner๊ฐ ์ฃผ์ด์ก์ง๋ง merge์์๋ ์ด๋ ํ ๋ชจ์ต๋ ์ฐพ์๋ณผ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ merge๋ ๋จ์ํ ๋ฐ์ดํฐ๋ง์ ๊ฒฐํฉํ๋ ์ฐ์ฐ์๋ผ๊ณ ํ ์ ์์ต๋๋ค.
๋น์ทํ ์ฐ์ฐ์๋ก zip๊ณผ ๋์ผํ๊ฒ mergeWith๊ฐ ์กด์ฌํฉ๋๋ค.
mergeWith ์ญ์ zipWith์ ์ฌ์ฉ๋ฒ์ด ๋น์ทํ์ง๋ง merge์ ๋ง์ฐฌ๊ฐ์ง๋ก combiner์ zipper์ ๊ฐ์ lambda ํจ์ ์ธ์๊ฐ ์ฃผ์ด์ ธ ์์ง ์์ต๋๋ค.
Disposable mp = Observable.just(300, 600, 900).mergeWith(
Observable.just(30, 60, 90)
).subscribe(System.out::println);
concat()
๋ง์ง๋ง์ผ๋ก concat ์ฐ์ฐ์์ ๋๋ค. concat ์ฐ์ฐ์๋ ์ด๋ฆ ๊ทธ๋๋ก ๊ฐ์ฒด๋ฅผ ์ด์ด ๋ถ์ฌ์ฃผ๋ ์ฐ์ฐ์์ ๋๋ค. 2๊ฐ ์ด์์ Observable ๊ฐ์ฒด๋ฅผ ์ด์ด ๋ถ์ฌ ํ๋์ ObservableSource๋ก ๋ง๋ค์ด์ฃผ๋ ์ฐ์ฐ์๋ก ์์์ ๋ณธ ๊ฒฐํฉ ์ฐ์ฐ์์ ๋ค์ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
๋ณด๋ค์ํผ ๋ณ๋ค๋ฅธ ์ค์ผ์ค๋ฌ๋ฅผ ํตํด ์ฐ์ฐ ์ฒ๋ฆฌ๋ฅผ ํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฒซ ๋ฒ์งธ Observable์ onComplete ์ด๋ฒคํธ๊ฐ ๋ฐ์ํด์ผ๋ง ๋ ๋ฒ์งธ Observable์ ๊ตฌ๋ ํ์ฌ ๊ฒฐํฉํ๋ ํํ์ด๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ ์ค๋ ๋๋ฅผ ์ด์ฉํ๋ค๋ ์ ์ด ์์ต๋๋ค.
๋ ํ ๊ฐ์ง๋ ๋ ๋ฒ์งธ Observable์ด ๊ณ์ ๋ฐํ๋๋ค ํ๋๋ผ๋ ์ฒซ ๋ฒ์งธ Observable์ด ๋ฐํ๋์ง ์์ผ๋ฉด ์๋ฌด๋ฐ ์์ฉ์ด ์๊ธฐ ๋๋ฌธ์ ์ด๋ก์จ ๋ค๋ฅธ Observable์ ๋ฌดํ์ ๋๊ธฐ ์ํ์ ์ด๋ฅด๊ฒ ๋๋ฉฐ ์ด ๊ณผ์ ์ด ์ง์๋ ๊ฒฝ์ฐ Memory Leak(๋ฉ๋ชจ๋ฆฌ ๋์) ํ์์ผ๋ก ์ด๋ฌ์ด์ง๊ธฐ๋ ํฉ๋๋ค. ๋ฐ๋ผ์ ์ด ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ๋๋ ์ฒซ ๋ฒ์งธ Observable์ด ๋ฐ๋์ onComplete ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ์ ์๋๋ก ์ ๋ํ๋ ์ฝ๋๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก ๊ฒฐํฉํ ์ ์๋ Observable ๊ฐฏ์๋ ์ต๋ 4๊ฐ์ ๋๋ค.
์กฐ๊ฑด ์ฐ์ฐ์
์กฐ๊ฑด ์ฐ์ฐ์๋ Observable ๊ฐ์ฒด ๋ด ๋ฐ์ดํฐ์ ํ๋ฆ์ ์ ์ดํ๋ ์ฐ์ฐ์์ ๋๋ค. ์ฐ๋ฆฌ๋ ์ด์ ๋น์ทํ ์ฐ์ฐ์๋ก filter ์ฐ์ฐ์๋ฅผ ๋ณผ ์ ์๋๋ฐ, filter ์ฐ์ฐ์๋ Observable ๊ฐ์ฒด ๋ด ๋ฐ์ดํฐ์์ ์ํ๋ ์กฐ๊ฑด์ ๋ถํฉํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๊ณ , ๋ฏธ๋ถํฉํ๋ ๋ฐ์ดํฐ๋ ๊ธฐ๊ฐํ๋ ์ฐ์ฐ์ด ๋ชฉ์ ์ด์๋ค๋ฉด ์ง๊ธ ๋ค๋ฃจ๊ณ ์ ํ๋ ์กฐ๊ฑด ์ฐ์ฐ์๋ ๋ฐ์ดํฐ์ ๋ฐํ ์ฌ๋ถ ๋ณด๋ค๋ ๊ทธ ํ๋ฆ์ ์ ์ดํ๋ ์ฐ์ฐ์๋ผ๊ณ ๋ณด๋ฉด ๋๊ฒ ์ต๋๋ค.
amb()
amb ์ฐ์ฐ์๋ ์ฌ๋ฌ ๊ฐ ๋ค์ด์ค๋ Observable ์ค์์ ๊ฐ์ฅ ๋จผ์ ๋ฐ์ดํฐ๊ฐ ๋ฐํ๋๋ ๊ฒ์ ์ ํํ๋ ์กฐ๊ฑด ์ฐ์ฐ์์ ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ดํ ๋ฐํ๋๋ Observable์ ์ด๋ป๊ฒ ๋๋ ๊ฑด๊ฐ์? ๊ณต๊ต๋กญ๊ฒ๋ ์ ๋ถ ๊ณต์ค๋ถํด๋ฉ๋๋ค.. ใ ใ
amb ์ฐ์ฐ์์์ amb๋ ambiguous(๋ชจํธํ) ์ด๋ผ๋ ๋จ์ด์์ ํ์๋์์ผ๋ฉฐ ๋ชจ๋ Observable์ด ๋์ผํ๊ฒ ์๋ ๊ฐ์ด๋ฐ์์๋ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ๋ฐํ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๊ธฐ ๋ณด๋ค๋ ๊ทธ ์ค์์ ๋จผ์ ์ค๋ ํ ๊ฐ (์ ์ฐฉ์)์ผ๋ก ๋ฐ๋๋ค๊ณ ์ดํดํ์๋ฉด ๋๊ฒ ์ต๋๋ค.
Disposable ap = Observable.amb(
Arrays.asList(Observable.just("N.K").delay(2, TimeUnit.SECONDS), Observable.just("NEONKID"))
).subscribe(System.out::println);
์ด๋ฅผ ์ฝ๊ฒ ์ดํดํ๊ธฐ ์ํด delay ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด์ ์ฒ์ ๋ฐํํ N.K ๋ผ๋ Observable ๊ฐ์ฒด์๋ 2์ด ๊ฐ์ ์ง์ฐ์ ์ฃผ๊ณ , ๊ทธ ๋ค์์ ์๋ NEONKID๋ผ๋ Observable ๊ฐ์ฒด๋ ๋ฐ๋ก ๋ฐํํ ์ ์๋๋ก ์ฒ๋ฆฌํ๊ฒ๋ ๊ตฌํํ๋ฉด ๋จผ์ ๋ฐํ์ด ๋ NEONKID๊ฐ ์ถ๋ ฅ๋จ์ ์ ์ ์์ต๋๋ค.
๋น์ทํ ์ฐ์ฐ์๋ก ambWith ์ฐ์ฐ์๊ฐ ์์ต๋๋ค. ๋ณด์๋ค์ํผ ๊ธฐ์กด์ Observable ๊ฐ์ฒด์์ ์ฌ์ฉํ ์ ์๋ ์ฐ์ฐ์์ด๊ณ , amb ์ฐ์ฐ์์ ๋ค๋ฅด๊ฒ Iterable์ด ์๋ ์ผ๋ฐ Observable ๋ฐ์ดํฐ๋ฅผ ์ธ์๋ก ๋ฐ๊ณ ์์ต๋๋ค.
takeUntil()
์ด ์ฐ์ฐ์๋ ์กฐ๊ธ ํน์ดํ ์ฐ์ฐ์์ธ๋ฐ, ์ฌ์ ์ ๋จผ์ ๋ค์ด์จ Observable ๊ฐ์ฒด๋ฅผ ๋ฐํํ๊ณ ๊ตฌ๋ ํ๊ณ ์๋ ์ํ์์ ์ธ์๋ก ๋๊ฒจ ๋ฐ์ Observable์ด ๋ฐํ๋๋ฉด ๋จผ์ ๋ฐํ๋์๋ Observable ๊ฐ์ฒด๋ฅผ ๋ฌด์ํ๊ณ ์ธ์๋ก ๋ฐ์ Observable์ ๋ฐํํ ๋ค์ ์์ ์ ๋ง์น๋ ์ฐ์ฐ์์ ๋๋ค.
ํํฐ ์ฐ์ฐ์์ take์ ์ฐจ์ด์ ์ด ์๋ค๋ฉด take๋ ํน์ ๊ฐฏ์๋ง ๊ฐ์ ๋ฐํํ๋, ์์ ์๋ฃ ๊ธฐ์ค์ ๋ค๋ฅธ Observable ๊ฐ์ ๋ฐํ์ผ๋ก ํ๊ฒ ๋ค๋ ๊ฒ์ด์ฃ . ์ฆ ํน์ Observable ๊ฐ์ฒด์ ๊ฐ์ด ๋ค์ด์ค๋ฉด ๋ค๋ฅธ ๋ฐ์ดํฐ์ ๋ฐํ์ด ์๋ฃ๋์ง ์์๋ ๋ฐ๋ก ์๋ฃ ์ด๋ฒคํธ๋ฅผ ๋ํ๋ด๋ ๊ฒ์ ๋๋ค.
์ธ์๋ก ๋ค์ด์ค๋ Observable์ ๋จ์ผ Observable์ ํฌํจํ์ฌ ๊ฒฐํฉ๋ ObservableSource(๋ณต์ Observable)์ ํฌํจํฉ๋๋ค. ํด๋น Observable์ด ๋ฐํ๋๋ฉด ๋ค๋ฅธ ํ์ฌ ์งํ๋๊ณ ์๋ Observable์ ๋ฐํ์ ์ฆ๊ฐ ์ค๋จํ๊ณ onComplete ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํค๋ ์ฐ์ฐ์์ ๋๋ค.
skipUntil()
takeUntil ์ฐ์ฐ์์๋ ์ ๋ฐ๋๋ก ์ธ์๋ก ์ฃผ์ด์ง Observable์ ๋ฐํํ ๋ค์๋ถํฐ ๊ธฐ์กด์ ์ฃผ์ด์ง Observable ๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๊ฒ ๋ค๋ ์ฐ์ฐ์์ ๋๋ค.
์ฃผ์ด์ง ์ธ์์๋ other๋ผ๋ Observable ์ธ์๊ฐ ์์ต๋๋ค. ์ด other Observable์ด ๋ฐ์ดํฐ๊ฐ ๋ฐํํ ๋๊น์ง๋ ๊ธฐ์กด์ ์ ๋ ฅ๋ Observable ๊ฐ์ฒด์์๋ ์๋ฌด๋ฐ ์์ ์ด ์ผ์ด๋์ง ์์ผ๋ฉฐ other Observable ๊ฐ์ฒด๊ฐ ๋ฐํ๋ ๋ค์ ๊ธฐ์กด Observable ๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋ ์ฐ์ฐ์์ ๋๋ค.
all()
๋ง์ง๋ง์ผ๋ก all ์ฐ์ฐ์๋ ์ฃผ์ด์ง ๋ชจ๋ ์กฐ๊ฑด์ ๋ถํฉํ๋ Observable์ ๋ฐํํ๋ ์ฐ์ฐ์์ ๋๋ค.
์ด ๋ ๋ฐ๋ ์ธ์๋ Predicate์ธ๋ฐ, Predicate๋ filter ์ฐ์ฐ์์์ ์ฌ์ฉํ๋ ํ์ ์ผ๋ก ๋๋ค ํจ์ ์ธ์์ ํจ๊ผ ์กฐ๊ฑด์ ์ฃผ์ด์ฃผ๋ ํ์ ์ ๋๋ค. ๋ฐ๋ผ์ ์ด ๋๋ค์ ์กฐ๊ฑด์ด ์ฐธ์ด๋ฉด true ๊ฑฐ์ง์ด๋ฉด false๋ฅผ ๋ฐํํ๋ฉฐ true์ธ ๊ฐ๋ง ๋ฐํํฉ๋๋ค.
๋ค์ ํฌ์คํธ์ ์ด์ด์ 3ํธ(์ํ ์ฐ์ฐ์ ๋ฐ ๊ธฐํ ์ฐ์ฐ์)์ ์ด์ด๊ฐ๋๋ก ํ๊ฒ ์ต๋๋ค.
์ฐธ๊ณ (์ด๋ฏธ์ง): https://reactivex.io/RxJava/javadoc/