본문 바로가기

프로그래밍/RxJava

[RxJava] Subject 클래스 - BehaviorSubject 클래스

이전 글에서 Subject 클래스의 기본과 AsyncSubject 클래스에 대해서 다뤘다.

이번 글에서는 BehaviorSubject 클래스에 대해서 알아보도록 하자.

 

BehaviorSubject는 (구독자가) 구독을 하면 가장 최근 값 혹은 기본값을 넘겨주는 클래스이다.

예를 들어서, 온도 센서에서 값을 받아온다면 가장 최근 온도 값을 받아오는 동작을 구현할 수 있다.

또한 온도를 처음 얻을 때는 초깃값(예를 들어 0)을 반환하기도 한다.

 

BehaviorSubject 마블다이어그램

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'를 두 구독자 모두에게 발행하게 된다.

 

BehaviorSubject 전체 코드 보러가기