![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/DyX8f/btqFMHeSsYj/RMUnBEpvu020RsmDF2Uf31/img.jpg)
변환 연산자 데이터 흐름을 원하는 대로 변형할 수 있습니다. concatMap flatMap와 매우 비슷합니다. flatMap은 먼저 들어온 데이터를 처리하는 도중에 새로운 데이터가 들어오면 나중에 들어온 데이터의 처리 결과가 먼저 출력될 수도 있습니다. 하지만 concatMap은 먼저 들어온 데이터 순서대로 처리해서 결과를 낼 수 있도록 보장합니다. 입력 import common.CommonUtils import common.Log import io.reactivex.Observable import java.util.concurrent.TimeUnit class ConcatExample { fun marbleDiagram() { CommonUtils.start() val balls = arrayOf("..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/brjSc2/btqFwi8HhVD/Xm6adTJPUb190Un80kepy1/img.png)
Map map 함수는 입력 값을 어떤 함수에 넣어서 원하는 값으로 변환하는 함수입니다. map은 원을 입력 받아서 다이아몬드로 반환하는 것을 볼 수 있습니다. 아래는 마블 다이어그램을 코드로 표현한 것입니다. 입력 import io.reactivex.Observable class MapExample { fun marbleDiagram() { val balls = arrayOf("1", "2", "3", "5") val source = Observable.fromArray(*balls) .map { ball -> "$ball◇" } source.subscribe { data -> println(data) } } } fun main() { val demo = MapExample() demo.marbleDia..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/dkE8lW/btqFwjzDB6E/4tvMK18XdjUshwK2NoScxK/img.png)
Subject 클래스처럼 차가운 Observable을 뜨거운 Observable로 변환합니다. Observable을 여러 구독자에게 공유할 수 있으므로 원 데이터 하나를 여러 구독자에게 동시에 전달할 때 사용합니다. 특이한 점은 subscribe를 호출해도 아무 동작이 일어나지 않습니다. 새로 추가된 connect는 호출한 시점부터 subscribe를 호출한 구독자에게 데이터를 발행하기 때문입니다. ConnectableObservable 객체를 생성하려면 먼저 Observable에 publish를 호출해야 합니다. publish는 여러 구독자에게 데이터를 발행하기 위해 connect를 호출하기 전까지 데이터 발행을 유예하는 역할을 합니다. 입력 import io.reactivex.Observable cl..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/b0nnD0/btqFve62DLj/vC21gZG9wOMV4SrvdN27KK/img.png)
Subject 차가운 Observable을 뜨거운 Observable로 바꿔 줍니다. Subject 클래스의 특성은 Observable의 속성과 구독자 속성이 모두 있다는 것입니다. Observable처럼 데이터를 발행할 수 있고, 구독자처럼 발행된 데이터를 바로 처리할 수도 있습니다. Subject 클래스에는 AsyncSubject, BehaviorSubject, PublishSubject, ReplaySubject 등이 있습니다. AsyncSubject Observable에서 발행한 마지막 데이터를 얻어올 수 있는 Subject 클래스입니다. 마지막 데이터만 가져오고 이전 데이터는 무시합니다. 지금까지와 다르게 마블 다이어그램의 아래쪽에 있는 구독자의 시간 표시 줄이 여러 개입니다. 처음 구독자가 s..
Observable에는 차가운 Observable, 뜨거운 Observable이 있습니다. 차가운 Observable Observable을 선언하고 just, fromArray 함수를 호출해도 옵서버가 subscribe를 호출하여 구독하지 않으면 데이터를 발행하지 않습니다. 즉, 게으른 접근 법입니다. 웹 요청, 데이터베이스 쿼리, 파일 읽기 등에 쓰이고, 원하는 URL이나 데이터를 지정하면 그때부터 서버나 데이터베이스 서버에 요청을 하고 결과를 받아옵니다. 뜨거운 Observable 구독자의 존재 여부와 관계없이 데이터를 발행하는 Observable입니다. 즉, 여러 구독자를 고려할 수 있습니다. 마우스 이벤트, 키보드 이벤트, 시스템 이벤트 등이 있고, 온도를 처리하는 앱이라면 최근의 온도 정보만 표..
Maybe 클래스 Single 클래스와 같이 최대 데이터 하나를 가질 수 있지만 데이터 발행 없이 바로 데이터 발생을 완료할 수 있습니다. 즉, Maybe 클래스는 Single 클래스에 onComplete 이벤트가 추가된 형태입니다. Maybe 클래스를 통해서 생성 할 수 있지만 보통 Observable 연산자를 통해 생성합니다. Maybe 객체를 생성할 수 있는 연산자는 elementAt(), firstElement(), flatMapMaybe(), lastElement(), reduce(), singleElement() 등이 있습니다.
Single 클래스 Observable 클래스는 데이터를 무한하게 발행할 수 있지만, Single 클래스는 오직 1 개의 데이터만 발행합니다. API를 호출할 때 유용하게 사용할 수 있습니다. just 함수 입력 import io.reactivex.Single class SingleExample { fun just() { val source = Single.just("Hello Single") source.subscribe { x -> println(x) } } } fun main() { val demo = SingleExample() demo.just() } 출력 Hello Single Obserable에서 Single 클래스 사용 Single은 Observable의 특수한 형태이므로 Observabl..