본문 바로가기

gyub's 공부일기/RxJava

[RxJava] Subject 클래스, ConnectableObservable 클래스

1. Subject 클래스

앞서 잠시 말씀드렸다시피 Subject클래스는 차가운 Observable을 뜨거운 Observable로 바꿔준다고 했었습니다.

Subject 클래스의 특성은 Observable의 속성과 구독자의 속성이 모두 있다는 점입니다.

Observable처럼 데이터를 발행할 수도 있고 구독자처럼 발행된 데이터를 바로 처리할 수도 있습니다.

Subject클래스에는 AnsyncSubject, BehaviorSubject, PublishSubject, ReplaySubject 등이 있습니다!!

이것들을 알아봅시다!

 

1) AsyncSubject 클래스

AsyncSubject 클래스는 Observable에서 발행한 마지막 데이터를 얻어올 수 있는 Subject 클래스입니다. 완료되기 전 마지막 데이터에만 관심이 있고 이전 데이터는 무시해버립니다!

 

이 그림을 보면 잘 이해가 되실텐데여

 

- 처음 구독자가 subscribe()를 호출

- 이후에 빨간색, 초록색이 발행된 후 두 번째 구독자가 subscribe() 함수를 호출합니다.

- 마지막으로 파란색이 발행되고 데이터 발행을 완료(onComplete 이벤트)합니다.

 

이때 완료되기 전까지는 구독자에게 데이터를 전달하지 않다가 완료됨과 동시에 첫 번째와 두 번째 구독자에게 마지막 데이터를 발행하고 종료합니다.

 

2) BehaviorSubject 클래스

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

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

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

 

마찬가지로 그림을 보시면 쉬울거에요

 

- 처음 구독자가 subscribe()를 호출

- 괄호 안에 있는것은 default 값

- 빨간색, 초록색을 발행하고 두번째 구독자가 subscribe() 호출

- 마지막으로 파란색이 발행되고 완료

 

BehaviorSubject 클래스는 AsyncSubject 클래스와는 다르게 createDefault() 함수로 생성합니다.

구독자가 subscribe() 함수를 호출했을 때 그전까지 발행한 값이 없다면 기본값을 대신 발행해야 하기 때문이죠

 

3) PublishSubject 클래스

가장 평범한 Subject 클래스입니다!

구독자가 subscribe() 함수를 호출하면 값을 발행하기 시작합니다. AsyncSubject 클래스처럼 마지막 값만 발행하거나 BehaviorSubject 클래스처럼 발행한 값이 없을 때 기본값을 대신 발행하지도 않습니다. 오직 only!!! 해당 시간에 발생한 데이터를 그대로 구독자에게 전달받습니다.

 

 

딱 각 데이터가 발생한 시점에서만 전달을 받죠!

 

4) ReplaySubject 클래스

마지막으로 소개할 Subject 클래스는 가장 특이하고 사용할 때 주의해야 하는 ReplaySubject 클래스입니다.

Subject 클래스의 목적은 뜨거운 Observable을 활용하는 것인데 요건 차가운 Observable처럼 동작하기 때문입니다!

 

ReplaySubject 클래스는 구독자가 새로 생기면 항상 데이터의 처음부터 끝까지 발행하는 것을 보장해줍니다.

라잌~ 테이프로 전체 내용을 녹음해뒀다가 새로운 사람이 들어오면 정해진 음악을 처음부터 들려주는 것과 같죠

 

그래서 ~!! 모든 데이터 내용을 저장해두는 과정 중 메모리 누수가 발생할 수 있습니다!!!

 

그림에서 보면 첫 번째, 두 번째 구독자 모두 발행된 데이터를 가져오죠

 

2. ConnectableObservable 클래스

ConnectableObservable 클래스는 Subject 클래스처럼 차가운 Observable을 뜨거운 Observable로  변환합니다.

Observable을 여러 구독자에게 공유할 수 있으므로 원 데이터 하나를 여러 구독자에게 동시에 전달할 때 사용합니다.

특이한 점은 subscribe() 함수를 호출해도 아무 동작이 일어나지 않는다는 것입니다. 새로 추가된 connect() 함수는 호출한 시점부터 subscribe() 함수를 호출한 구독자에게 데이터를 발행하기 때문입니다.

 

ConnectableObservable 객체를 생성하려면 먼저 Observable에 publish()함수를 호출해야 합니다. 이 함수는 여러 구독자에게 데이터를 발행하기 위해 connect() 함수를 호출하기 전까지 데이터 발행을 유예하는 역할을 합니다.

 

ConnectableObservable.publish()의 그림을 보겠습니다!!

 

 

반응형