[RxJava] 2. Reactive ๊ธฐ๋ณธ ์—ฐ์‚ฐ์ž(Operator) - map, filter, reduce

๋ฐ˜์‘ํ˜•

Reactive Programming์—์„œ ๊ฝƒ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋Š” Reactive Operator์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์—ฌ๋Ÿฌ๋ถ„๋“ค์ด Java 8์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ์ด๋Ÿฌํ•œ Reactive ์—ฐ์‚ฐ์ž๊ฐ€ ๋งค์šฐ ์ต์ˆ™ํ•˜์‹ค ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

 

RxJava์—์„œ๋Š” Reactive Programming์— ๋งž์ถฐ, ์ด๋Ÿฌํ•œ Reactive Operator๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๋Ÿฌ๋ถ„๋“ค์ด ์•„์…”์•ผํ•  ๊ฒƒ์€ ์ด๋Ÿฐ Reactive ์—ฐ์‚ฐ์ž๊ฐ€ ๋‹จ์—ฐ RxJava, Java 8์—์„œ์™€ ๊ฐ™์ด "Java"์—์„œ๋งŒ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. Python์—์„œ๋„ Javascript์—์„œ๋„ Reactive Programming๋งŒ ์ง€์›ํ•œ๋‹ค๋ฉด ์ด๋Ÿฌํ•œ ์—ฐ์‚ฐ์ž๋Š” ์–ด๋””์„œ๋“  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” RxJava์—์„œ Reative Operator๊ฐ€ ์–ด๋–ค์‹์œผ๋กœ ์กด์žฌํ•˜๋Š”์ง€ ์•Œ์•„๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ ์ „์— Reactive ์—ฐ์‚ฐ์ž๋ฅผ ์ œ๋Œ€๋กœ ๊ณต๋ถ€ํ•˜๊ณ  ์งš์–ด๋ณด๋„๋ก ํ•˜์ฃ .

 

 

 

Reactive Operator

์•ž์„œ ๋งํ–ˆ๋“ฏ์ด Reactive Operator๋Š” ๋‹จ์—ฐ Java์—์„œ๋งŒ ์กด์žฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ .NET, Scala, Swift ๋“ฑ Reactive Programming์„ ์ง€์›ํ•˜๋Š” ์–ธ์–ด๋ผ๋ฉด ์–ด๋””์„œ๋“  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ฒˆ์— RxJava๋ฅผ ํ†ตํ•ด์„œ ์ด๋Ÿฌํ•œ Reactive ์—ฐ์‚ฐ์ž๋ฅผ ์ˆ™๋‹ฌํ•œ๋‹ค๋ฉด ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ๋„ ์‰ฝ๊ฒŒ ์ด์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ฐ„๋‹จํ•˜๊ฒŒ ํŠน์ง•์„ ์ •๋ฆฌํ•ด๋ดค์Šต๋‹ˆ๋‹ค.

 

  • ๋‹ค์–‘ํ•œ ์—ฐ์‚ฐ ํ•จ์ˆ˜์˜ ์กด์žฌ

    -> map, filter, reduce ๋“ฑ 400๊ฐœ ์ด์ƒ์˜ ์—ฐ์‚ฐ ํ•จ์ˆ˜๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ, ๋Œ€๋ถ€๋ถ„ map, filter, reduce์—์„œ ํŒŒ์ƒ๋œ ๊ฒƒ๋“ค์ž…๋‹ˆ๋‹ค.

  • ์–ธ์–ด์˜ ํŠน์„ฑ๊ณผ๋Š” ๋ฌด๊ด€

    -> ๋Œ€๋ถ€๋ถ„์˜ Reactive Programming์„ ์ง€์›ํ•˜๋Š” ์–ธ์–ด์—์„œ ์ด๋Ÿฌํ•œ ํ•จ์ˆ˜ ์ด๋ฆ„์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ.

 

๊ทธ๋ ‡๋‹ค๋ฉด Reactive Operator์—๋Š” ์–ด๋– ํ•œ ๊ฒƒ๋“ค์ด ์žˆ์„๊นŒ์š”?

 

์—ฐ์‚ฐ์ž ์ข…๋ฅ˜ ์ •์˜ ์˜ˆ์ œ
์ƒ์„ฑ(Creating) ์—ฐ์‚ฐ์ž Observable, Single ํด๋ž˜์Šค ๋“ฑ์„ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„์„ ๋งŒ๋“ค์–ด๋‚ด๋Š” ํ•จ์ˆ˜ create(), just(), fromArray(), interval(), range(), timer() ๋“ฑ
๋ณ€ํ™˜ (Transforming) ์—ฐ์‚ฐ์ž ์ž…๋ ฅ์„ ๋ฐ›์•„์„œ ์›ํ•˜๋Š” ์ถœ๋ ฅ์„ ๋‚ด๋Š” ์ „ํ†ต์ ์ธ ์˜๋ฏธ์˜ ํ•จ์ˆ˜ map(), flatmap() ๋“ฑ
ํ•„ํ„ฐ(Filter) ์—ฐ์‚ฐ์ž ์ž…๋ ฅ ๋ฐ์ดํ„ฐ ์ค‘ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ณจ๋ผ๋‚ด๋Š” ํ•จ์ˆ˜ filter(), first(), take() ๋“ฑ
๊ฒฐํ•ฉ(Combining) ์—ฐ์‚ฐ์ž ๋‘ ๊ฐœ ์ด์ƒ์˜ ์ž…๋ ฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋กœ ํ†ตํ•ฉํ•˜๋Š” ์—ฐ์‚ฐ์ž zip(), combineLatest(), Merge(), concat()
์˜ค๋ฅ˜์ฒ˜๋ฆฌ(Error Handling) ์—ฐ์‚ฐ์ž ์—ฐ์‚ฐ์ž ๋‚ด์—์„œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๊ตฌํ˜„์„ ์œ„ํ•œ ํ•จ์ˆ˜ onErrorReturn(), onErrorResumeNext(), retry() ๋“ฑ
์กฐ๊ฑด(Conditional) ์—ฐ์‚ฐ์ž Observable์˜ ํ๋ฆ„์„ ์ œ์–ดํ•˜๋Š” ์—ญํ•  amb(), takeUntil(), skipUntil(), all() ๋“ฑ
์ˆ˜ํ•™๊ณผ ์ง‘ํ•ฉํ˜• ์—ฐ์‚ฐ์ž ์ˆ˜ํ•™ ํ•จ์ˆ˜์™€ ์—ฐ๊ด€์žˆ๋Š” ์—ฐ์‚ฐ์ž sum() ๋“ฑ
๊ธฐํƒ€ (Other) ์—ฐ์‚ฐ์ž ๊ตฌ๋…, ๋ฐœํ–‰ ๋“ฑ์˜ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ๋ฐ ๋ฐ์ดํ„ฐ์˜ ์ˆซ์ž๋ฅผ ์„ธ๋Š” ํŠน์ง•๋ณ„ ์—ฐ์‚ฐ์ž subscribeOn(), observeOn(), count() ๋“ฑ

์ด๋ ‡ ๋“ฏ RxJava์—์„œ ์ œ๊ณตํ•˜๋Š” ์ˆ˜๋งŽ์€ ์—ฐ์‚ฐ์ž๋“ค์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค๋งŒ ์ด๋ฅผ ์กฐ๊ธˆ ๊ฐ„์ถ”๋ ค์„œ ์ด๋ ‡๊ฒŒ ์ •๋ฆฌํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” map, filter, reduce์—์„œ ๋Œ€๋ถ€๋ถ„ ํŒŒ์ƒ๋œ ์—ฐ์‚ฐ์ž๋“ค์ด๋ฉฐ ์ด๋“ค์˜ ์—ฐ์‚ฐ์ž๋“ค์€ ๋‹ค์Œ ํฌ์ŠคํŠธ์—์„œ ์ถ”ํ›„ ์ž์„ธํ•˜๊ฒŒ ๋‹ค๋ฃจ๊ณ , ์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” ๊ธฐ๋ณธ ์—ฐ์‚ฐ์ž์ธ map, filter, reduce์— ๋Œ€ํ•ด์„œ ์ค‘์ ์ ์œผ๋กœ ๋‹ค๋ค„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

 

 

map

map์€ ์ž…๋ ฅ๋œ ๋ฐ์ดํ„ฐ์— ์—ฌ๋Ÿฌ๋ถ„๋“ค์ด ์ •์˜ํ•œ ํ•จ์ˆ˜๋ฅผ ๋„ฃ์–ด ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ฐ€๋ น Java์˜ Collections๋ฅผ ์˜ˆ๋กœ ๋“ค๋ฉด ์ด๋Ÿฐ์‹์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์šฐ๋ฆฌ๋Š” Point๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ์ด๋ฅผ ArrayList์— ์ €์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. Java 8์—์„œ๋Š” Stream ํด๋ž˜์Šค์—์„œ Reactive ์—ฐ์‚ฐ์ž๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์—ฌ๊ธฐ์„œ map์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ฃ . 

 

RxJava์—์„œ๋Š” Observable ํด๋ž˜์Šค๋ฅผ ํ•œ ๊ฐœ ๋งŒ๋“ค๊ณ , ์ด๋ฅผ ์‚ฌ์šฉํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์™ธ๋ถ€์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ณ„์† ๋“ค์–ด์˜จ๋‹ค๋Š” ๊ฐ€์ •ํ•˜์— Observable ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, ์œ„์™€ ๊ฐ™์ด ํ•œ ๊ฐœ์˜ ํฌ์ธํŠธ๋งŒ ์ฃผ์–ด์งˆ ๋•Œ๋Š” ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Point๊ฐ€ ํ•œ ๊ฐœ๊ฐ€ ์•„๋‹Œ ๋ฆฌ์ŠคํŠธ ํ†ต์งธ๋กœ ๊ฐ€์ ธ์˜ค๊ฒŒ ๋œ๋‹ค๋ฉด ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , fromIterable ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ์ฝ”๋“œ๋ฅผ ์ค„์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋ ‡๋‹ค๋ฉด ์ด ์—ฐ์‚ฐ์ž๋Š” ์–ด๋–ค์‹์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์ผ๊นŒ์š”?

 

์šฐ๋ฆฌ๋Š” ์ด๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด RxJava ๋ฌธ์„œ์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ทธ๋ฆผ์„ ํ•œ ๋ฒˆ ์ฐธ๊ณ ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆผ์—์„œ ๋ณด๋ฉด ๋™๊ทธ๋ผ๋ฏธ๋Š” ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋˜ Point ๊ฐ์ฒด์˜ ์›๋ณธ ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ map ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ์›ํ•˜๋Š” ์—ฐ์‚ฐ ํ•จ์ˆ˜๋ฅผ ๋„ฃ๊ณ , ๋งˆ๋ฆ„๋ชจ ํ˜•ํƒœ๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ๊ฒƒ์ด์ฃ .

 

ํ•ต์‹ฌ์€ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋ฆฌ์ŠคํŠธ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ์— ๋„ฃ๊ณ , ์ด๋ฅผ "์žฌ๊ฐ€๊ณต"ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

  • .map(point -> point.toString());

    -> map ์›ํ˜• : public final <R> Observable<R> map(Function<? super T, ? extends R> maper)

  • ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ํ˜•ํƒœ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Œ.

map ์›ํ˜•์„ ์ž์„ธํžˆ ๋ณด๋ฉด, ์–ด๋–ค ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. Function์€ ์ธํ„ฐํŽ˜์ด์Šค์ด๊ธฐ ๋•Œ๋ฌธ์— ์›ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ Lambda ์‹์œผ๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

 

flatMap

๊ทธ๋ ‡๋‹ค๋ฉด ์ด์™€ ๋น„์Šทํ•˜๊ฒŒ ์ƒ๊ธด flatMap์€ ๋ฌด์—‡์ผ๊นŒ์š”? ๊ฐ™์€ map์ธ๋ฐ ์™œ flatMap์ด๋ผ๋Š” ๊ฒƒ์ด ์กด์žฌํ• ๊นŒ์š”?

 

flatMap์€ ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐ˜๋“œ์‹œ Observable๋กœ ๋‚˜์˜จ๋‹ค๋Š” ๊ฒƒ์ด map๊ณผ ๋‹ค๋ฅธ์ ์ž…๋‹ˆ๋‹ค. map ํ•จ์ˆ˜๋Š” 1:1 ๋ฐ์ดํ„ฐ ์—ฐ์‚ฐ ํ•จ์ˆ˜๋ผ๋ฉด flatMap์€ 1:N, 1:1 Observable ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

 

๋˜ํ•œ map์€ ๋™๊ธฐ ๋ฐฉ์‹์ด๊ธฐ ๋•Œ๋ฌธ์— ๋น„๋™๊ธฐ์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๊ทธ ํšจ๊ณผ๋ฅผ ๋ณด๊ธฐ ์–ด๋ ค์šฐ๋ฉฐ ๋น„๋™๊ธฐ ์ž‘์—…์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒฝ์šฐ map์ด ์•„๋‹Œ flatMap์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

๊ทธ๋ฆผ์„ ๋จผ์ € ๋ณด๋ฉด, ์—ญ์‹œ ๋™๊ทธ๋ผ๋ฏธ๊ฐ€ ์›๋ณธ ๋ฐ์ดํ„ฐ์ด๊ณ  ๋งˆ๋ฆ„๋ชจ๊ฐ€ ๋ณ€ํ˜•๋œ ๊ฒฐ๊ณผ์˜ ๋ฐ์ดํ„ฐ๋ผ๊ณ  ํ–ˆ์„ ๋•Œ ํ•œ Object ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹Œ ์—ฌ๋Ÿฌ Object์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ์ข€ ๋” ํšจ์œจ์ ์ธ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค๋ฉด 2์ฐจ์› ๋ฐฐ์—ด, Map์„ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ํšจ์œจ์ ์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋กœ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ Object๋กœ ๋˜์–ด ์žˆ๊ณ , ์ด ๋‘ ๊ฐœ๋ฅผ ๋ชจ๋‘ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด map์„ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ๋Š” ์„œ๋กœ๊ฐ€ ๋‹ค๋ฅธ ๋‘ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด map์„ ํ•œ ๋ฒˆ์”ฉ ์จ์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ flatMap์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์„œ๋กœ ๊ฐ๊ธฐ ๋‹ค๋ฅธ Object๋ผ ํ• ์ง€๋ผ๋„ ์ด๋ฅผ flatMap ํ•œ ๋ฒˆ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์ฃ .

 

RxJava์—์„œ Observable ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐœํ–‰ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งŒ์•ฝ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์•ผ ํ•œ๋‹ค๋ฉด flatMap์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๊ณ , ์—ฌ๊ธฐ์— ๋ฐฐ์••์„ ๊ณ ๋ คํ•œ๋‹ค๋ฉด Flowable๊นŒ์ง€ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹๊ฒ ๊ตฐ์š”.

 

์ •๋ฆฌํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

  • map: 1๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฅธ ๊ฐ’์ด๋‚˜ ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜.
  • flatMap: 1๊ฐœ์˜ ๊ฐ’์„ ๋ฐ›์•„ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ(Observable)๋กœ ํ™•์žฅ

 

 

 

 

filter

๋ฐ์ดํ„ฐ๋“ค ์ค‘์—์„œ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ ๋ฅผ ์ˆ˜ ์žˆ๋Š” filter ํ•จ์ˆ˜๋Š” Predicate๋ฅผ ์ธ์ž๋กœ ๋„ฃ์–ด ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋งŒ ๋„์ง‘์–ด๋‚ด๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

 

0, 0์—์„œ 2, 2๊นŒ์ง€์˜ ์ขŒํ‘œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์‚ฌ๊ฐํ˜•์—์„œ ์˜ค๋ฅธ์ชฝ ์ขŒํ‘œ ๋ฐ์ดํ„ฐ๋งŒ ๊ฐ€์ ธ์˜ค๊ณ  ์‹ถ์„ ๋•Œ ์œ„์™€ ๊ฐ™์ด Point์—์„œ y ๊ฐ’์ด 2์ธ ๊ฐ’๋งŒ ๊ฐ€์ ธ์˜ค๊ฒŒ๋” filter ์•ˆ์— ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜์—ฌ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋งŒ ๋„์ง‘์–ด ๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์—ฌ๊ธฐ์„œ filter๋Š” Function ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์•„๋‹ˆ๋ผ Predicate ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด๊ฐ€ ์ •์˜ํ•œ ์ฝ”๋“œ๊ฐ€ ํ•จ์ˆ˜์ธ์ง€ Predicate์ธ์ง€๋ฅผ ์ข€ ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์œ„ ์ฝ”๋“œ์ฒ˜๋Ÿผ Lambda๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ํ•˜๋‚˜์˜ ๋ฐฉ๋ฒ•์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

  • first() : Observable์˜ ์ฒซ ๋ฒˆ์งธ ๊ฐ’ ๋ฐ˜ํ™˜
  • last() : Observable์˜ ๋งˆ์ง€๋ง‰ ๊ฐ’ ๋ฐ˜ํ™˜
  • take(N) : ์ฒ˜์Œ๋ถ€ํ„ฐ N๊ฐœ๊นŒ์ง€์˜ ๊ฐ’ ๋ฐ˜ํ™˜
  • takeLast(N) : ๋งˆ์ง€๋ง‰์—์„œ๋ถ€ํ„ฐ N๊ฐœ ๊นŒ์ง€์˜ ๊ฐ’ ๋ฐ˜ํ™˜
  • skip(N) : ์ฒ˜์Œ๋ถ€ํ„ฐ N๊ฐœ๊นŒ์ง€์˜ ๊ฐ’์„ ๊ฑด๋„ˆ๋›ฐ๊ณ  ๊ทธ ๋‹ค์Œ ๊ฐ’๋ถ€ํ„ฐ ๋ฐ˜ํ™˜
  • skipLast(N) : ๋งˆ์ง€๋ง‰ N๊ฐœ๊นŒ์ง€์˜ ๊ฐ’์„ ๊ฑด๋„ˆ๋›ฐ๊ณ  ๊ทธ ์ด์ „ ๊ฐ’๋ถ€ํ„ฐ ๋ฐ˜ํ™˜

filter๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ด๋ฏธ RxJava์—์„œ ์ •์˜๋œ ํ•„ํ„ฐ๋ง์ด ๋ช‡ ๊ฐœ ์žˆ๋Š”๋ฐ, ์ด๋ฅผ ์‚ฌ์šฉํ•ด์„œ๋„ ํ•„ํ„ฐ๋ง ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

ํ•„ํ„ฐ๋ง ํ•จ์ˆ˜๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€์˜ ๋ฐ์ดํ„ฐ ์ค‘ ์›ํ•˜๋Š” ๋™๊ทธ๋ผ๋ฏธ ๋ฐ์ดํ„ฐ๋งŒ ๋ฝ‘์•„๋‚ธ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. 

 

 

 

 

reduce

๋งˆ์ง€๋ง‰์œผ๋กœ reduce ์—ฐ์‚ฐ์ž๋Š” ๋‘ ๊ฐœ ์ด์ƒ์˜ ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋กœ ์ทจํ•ฉํ•˜๋Š” ์—ฐ์‚ฐ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ฐ€๋ น ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐœํ–‰๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ์ทจํ•ฉํ•˜์—ฌ ๋ฆฌ์ŠคํŠธ๋กœ ๋งŒ๋“ค๊ณ , ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ๊ฑด ์ทจํ•ฉํ•ด์„œ ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋กœ ํ•ฉ์ณ์ค„ ๋•Œ reduce๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

RxJava์—์„œ reduce๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Observable์ด ์•„๋‹Œ Maybe ํด๋ž˜์Šค๋กœ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” reduce ์•ˆ์ชฝ ๋žŒ๋‹ค ํ•จ์ˆ˜ ๊ตฌํ˜„์‹œ ๊ฒฐ๊ณผ ๊ฐ’์ด ๋ฐ˜ํ™˜๋˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Nullable๊ณผ ํ˜ธํ™˜๋˜๋Š” Maybe ํด๋ž˜์Šค๋กœ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

 

ArrayList๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ชจ๋“  ํฌ์ธํŠธ์˜ ํ•ฉ์„ reduce๋ฅผ ์ด์šฉํ•ด์„œ ๊ตฌํ•œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. reduce๋Š” map, filter์™€ ๋‹ค๋ฅด๊ฒŒ ํ•จ์ˆ˜์˜ ์ธ์ž๋ฅผ ์ตœ๋Œ€ 2๊ฐœ๊นŒ์ง€ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋ฅผ ์ด์šฉํ•ด์„œ ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ๋กœ ์ทจํ•ฉํ•ฉ๋‹ˆ๋‹ค. ๋‹จ, ์ด ๋•Œ ๊ฒฐ๊ณผ๋Š” ์›๋ณธ ๋ฐ์ดํ„ฐ์˜ ํƒ€์ž…๊ณผ ๋˜‘๊ฐ™์€ ํƒ€์ž…์œผ๋กœ ๋ฐ˜ํ™˜๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

  • reduce(BitFunction<T, T, T> reducer)

    -> reduce๋Š” Function์ด ์•„๋‹Œ BitFunction ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ธ์ž๋กœ ํ™œ์šฉ (์ž…๋ ฅ ์ธ์ž๊ฐ€ ์ตœ๋Œ€ 2๊ฐœ๊นŒ์ง€ ์ ์šฉ)

  • Observable์ด ์•„๋‹Œ Maybe๋กœ ์›ํ˜• ๋ฐ˜ํ™˜

 

๊ทธ๋ฆผ์œผ๋กœ ๋ณด๋ฉด ์œ„์™€ ๊ฐ™์ด ์›๋ณธ ๋ฐ์ดํ„ฐ๋ฅผ ํ•ฉ์น˜๊ณ  ํ•ฉ์น˜๊ณ  ๋˜ ํ•ฉ์ณ์„œ ๋งˆ์ง€๋ง‰์œผ๋กœ๋Š” ์ตœ์ข… ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋กœ ์ทจํ•ฉํ•˜๋Š” ํ˜•ํƒœ๊ฐ€ ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฒƒ์ด reduce์ž…๋‹ˆ๋‹ค.

 

 

 

 

๋งˆ์น˜๋ฉฐ...

Reactive Programming์˜ ๊ธฐ๋ณธ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋Š” map, filter, reduce์— ๋Œ€ํ•ด ์•Œ์•„๋ดค์Šต๋‹ˆ๋‹ค. RxJava์—์„œ๋Š” ์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํ•˜์—ฌ ์ˆ˜ ๋ฐฑ๊ฐœ์˜ ์—ฐ์‚ฐ์ž๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ, ์šฐ๋ฆฌ๋Š” ์ด ์ค‘์—์„œ ๊ธฐ๋ณธ์ ์ธ ์—ฐ์‚ฐ์ž๋งŒ์„ ๋‹ค๋ฃฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฐ ๊ธฐ๋ณธ ์—ฐ์‚ฐ์ž๋งŒ ๋‹ค๋ฃฐ ์ค„ ์•Œ์•„๋„ ์–ด๋Š ์ •๋„ Reactive Programming์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ํฌ์ŠคํŠธ์—์„œ๋Š” RxJava๊ฐ€ ๊ฐ€์ง„ ์—ฐ์‚ฐ์ž ์ค‘ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ์—ฐ์‚ฐ์ž์— ๋Œ€ํ•ด ๋‹ค๋ค„๋ณผ ๊ฒƒ์ด์ง€๋งŒ ๋ชจ๋“  ์—ฐ์‚ฐ์ž๋ฅผ ๋‹ค ์™ธ์›Œ์„œ ์จ์•ผ ํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.

 

์œ„์—์„œ ์ž ๊น ๋‹ค๋ฅธ ์–ธ์–ด์˜ Reactive Programming์— ๋Œ€ํ•ด์„œ๋„ ์ด์•ผ๊ธฐ ํ–ˆ์—ˆ๋Š”๋ฐ, Rx์˜ ์‹œ์ดˆ๋Š” ์ด์ „ ํฌ์ŠคํŠธ์—์„œ๋„ ์–˜๊ธฐํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ .NET Core๊ฐ€ ๊ทธ ์‹œ์ดˆ์ด๋ฉฐ ํ•ด๋‹น ์—”์ง€๋‹ˆ์–ด๊ฐ€ Netflix๋กœ ์ด์งํ•˜๋ฉด์„œ Java์— ๋Œ€ํ•œ Rx๋ฅผ ๋งŒ๋“ค๊ณ  ๋‚˜์„œ RxJava๊ฐ€ ์‹œ์ž‘ํ–ˆ๋‹ค๋Š” ๊ฒƒ์œผ๋กœ ์œ ๋ž˜๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ˜„์žฌ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋“ค์ด Rx๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ๊ณ , ๊ทธ ์ค‘์—์„œ๋„ Java, Kotlin, Scala, Python์ด ์ œ๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” Reactive ์—ฐ์‚ฐ์ž๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ด๋Ÿฌํ•œ ์—ฐ์‚ฐ์ž๋Š” Java 8์—์„œ๋„ ๊ธฐ๋ณธ ์ œ๊ณต๋˜๋ฉฐ Java 8์—์„œ๋Š” Stream ํด๋ž˜์Šค ํ•˜์œ„ ๋ฉ”์†Œ๋“œ๋กœ ์ œ๊ณต๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ๊ฐ์˜ ํด๋ž˜์Šค, ์ปฌ๋ ‰์…˜์„ ์ด๋Ÿฌํ•œ ์—ฐ์‚ฐ์ž๋กœ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•  ๊ฒฝ์šฐ, Stream ํด๋ž˜์Šค๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Stream ํด๋ž˜์Šค๋Š” Observable๊ณผ๋Š” ๋‹ฌ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€์ฐฐํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋งŒ์•ฝ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€์ฐฐํ•˜๋ฉด์„œ Reactive Programming์˜ ์š”์†Œ๊นŒ์ง€ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด ๊ทธ ๋•Œ๋ถ€ํ„ฐ RxJava๋ฅผ ์ด์šฉํ•ด๋ณด๋Š” ๊ฒƒ์„ ๊ถŒํ•ฉ๋‹ˆ๋‹ค

 

 

 

์ฐธ๊ณ (์ด๋ฏธ์ง€): reactivex.io/documentation

๋ฐ˜์‘ํ˜•
TAGS.

Tistory Comments