본문 바로가기
Programming 개발은 구글로/JAVA[Android]

[RxJava] Subject 클래스, ConnectableObservable

by 40대직장인 2022. 12. 1.

Subject


Subject 클래스에는 대표적으로 AsyncSubject, BehaviorSubject, PublishSubject, ReplaySubject가 있다.

public abstract class Subject<T> extends Observable<T> implements Observer<T>


Subject의 가장 큰 특징은, Observable을 상속하고 Observer를 구현하고 있어 Observable처럼 쓰일 수도, Observer처럼 쓸 수도 있다는 것이다.

🟩 AsyncSubject 클래스

AsyncSubject 클래스는 Observable에서 발행한 마지막 데이터를 얻어올 수 있는 Subject 클래스입니다.

완료되기 전 마지막 데이터에만 관심이 있으며 이전 데이터는 무시합니다. 완료되기 전까지는 구독자에게 데이터를 전달하지 않다가 완료됨과 동시에 구독자에게 마지막 데이터를 발행하고 종료합니다.

onNext로 데이터를 전달하더라도 onComplete 이전엔 절대 데이터를 발행하지 않습니다.

또, Subject 클래스가 Observable을 상속하고 동시에 Observer 인터페이스를 구현하기 때문에 Subject 클래스는 구독자로도 동작할 수 있습니다.


후속 관찰자에게도 동일한 최종 값을 방출합니다.단, 소스 Observable이 오류로 종료되면AsyncSubject는 항목을 내보내지 않고 소스 관찰 가능에서 오류 알림을 전달하기만 하면 됩니다.

 

 

🟨 BehaviorSubject 클래스

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

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

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

AsyncSubject와 다르게 구독 시점부터 최근 값 또는 기본값 데이터를 발행합니다. onComplete가 되면 발행을 중지합니다.

 


단, 소스 Observable이 오류로 종료되면 BehaviorSubject는 후속 관찰자에게 항목을 내보내지 않고 단순히 소스 관찰 가능에서 오류 알림을 전달합니다.

 

 

🟦 PublishSubject 클래스

가장 평범한 Subject 클래스입니다. 구독자가 subscribe() 함수를 호출하면 값을 발행하기 시작합니다.

AsyncSubject 클래스처럼 마지막 값만 발행하거나 BehaviorSubject 클래스처럼 발행한 값이 없을 때 기본값을 대신 발행하지도 않습니다. 오직 해당 시간에 발생한 데이터를 그대로 구독자에게 전달받습니다.
쉽게 말해서 구독을 한 다음 onNext에 의해 데이터를 발행합니다.

PublishSubject 클래스는 별도의 기본값을 제공하지 않으므로 AsyncSubject 클래스처럼 create() 함수를 호출해 생성합니다.

 


ReplaySubject대신, 소스 Observable이 오류로 종료되면PublishSubject는 후속 관찰자에게 항목을 내보내지 않고 단순히 소스 관찰 가능에서 오류 알림을 전달합니다.

 

🟪 ReplaySubject 클래스

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

Subject 클래스의 목적은 Hot Observable을 활용하는 것인데 Cold Observable처럼 동작하기 때문입니다.

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

그러므로 모든 데이터 내용을 저장해두는 과정 중 메모리 누수가 발생할 가능성을 염두에 두고 사용할 때 주의해야 합니다.

 

 

⬛ ConnectableObservable

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

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

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

 

 


 

원문: Subject
https://reactivex.io/documentation/subject.html



 

댓글