이전 글에서 Subject 클래스의 기본과 AsyncSubject 클래스에 대해서 다뤘다.
이번 글에서는 BehaviorSubject 클래스에 대해서 알아보도록 하자.
BehaviorSubject는 (구독자가) 구독을 하면 가장 최근 값 혹은 기본값을 넘겨주는 클래스이다.
예를 들어서, 온도 센서에서 값을 받아온다면 가장 최근 온도 값을 받아오는 동작을 구현할 수 있다.
또한 온도를 처음 얻을 때는 초깃값(예를 들어 0)을 반환하기도 한다.
BehaviorSubject의 마블 다이어그램은 위와 같은 그림으로 표현된다.
여기서 '핑크색 원'은 BehaviorSubject 클래스를 생성할 때 넘긴 초깃값이 된다.
첫번째 구독자는 초깃값인 '핑크색 원'을 받고 다음에 '빨간색 원'부터 수신하게 된다.
두번째 구독자는 '초록색 원'이 발행된 이후에 구독했으므로, '초록색 원'을 맨 처음 전달한다.
이를 소스 코드로 구현하면 아래와 같이 된다.
public void marbleDiagram(){
BehaviorSubject<String> subject = BehaviorSubject.createDefault("pink");
subject.subscribe(data -> System.out.println("Subscriber #1 => " + data ));
subject.onNext("red");
subject.onNext("green");
subject.subscribe(data -> System.out.println("Subscriber #2 => " + data ));
subject.onNext("blue");
subject.onComplete();
}
[결과값]
Subscriber #1 => pink
Subscriber #1 => red
Subscriber #1 => green
Subscriber #2 => green
Subscriber #1 => blue
Subscriber #2 => blue
BehaviorSubject 클래스는 AsyncSubject 클래스와는 다르게 createDefault() 함수로 생성한다.
구독자가 subscribe() 함수를 호출했을 때, 그전까지 발행한 값이 없다면 기본값을 대신 발행해야하기 때문이다.
구독자가 subscribe() 함수를 호출 전에 발행한 값이 없기 때문에 기본값인 'pink'가 먼저 발행된다.
그리고 첫번째 구독자가 subscribe() 함수를 호출하면 차례로 'red','green'이 발행된다.
두번째 구독자가 subscribe() 함수를 호출하면 바로 전에 발행한 'green'을 맨 처음에 전달받는다.
그리고 'blue'를 두 구독자 모두에게 발행하게 된다.
'프로그래밍 > RxJava' 카테고리의 다른 글
[RxJava] Subject 클래스 - ReplaySubject 클래스 (0) | 2020.02.25 |
---|---|
[RxJava] Subject 클래스 - PublishSubject 클래스 (0) | 2020.02.25 |
[RxJava] Subject 클래스 - AsyncSubject 클래스 (0) | 2020.02.20 |
[RxJava] 뜨거운 Observable (0) | 2020.02.20 |
[RxJava] Maybe 클래스 (0) | 2020.02.17 |