View
오늘 다루어볼 것!!
이번에 다루어 볼내용은 저번에 다루었던 Hot Observable vs Cold observable
에서 나온 Subject 클래스에 대해서 다루어 볼것이다.
저번 스포스트인 AsyncSuject 클래스와 BehaviorSubject클래스에 대해서 다루어 봤는데 이번에는 남은 2개의 클래스에 대해서 다루어 볼것이다.(혹시 처음 글을 보는 사람을 위해서 똑같은 내용이 있다 양해바란당^^)
Subject 클래스?
Subject 클래스가 무엇일까?
Subject 클래스는 Hot Observable의 대표적인 클래스 중 하나로 Cold Observable을 Hot Observable로 변환해주고 Observable 속성과 Subscriber(구독자)의 속성을 모두 가지고 있다. 그래서 Observable처럼 데이터를 발행하고 구독자처럼 발행된 데이터를 바로 처리할 수 있다.
Subject에는 여러 종류가 있는데, 이제부터 천천히 어떤게 있고 어떤 특징이 있는지 알아보자~~!
- Subject 종류
- AsyncSubject
- BehaviorSubject
- PublishSubject
- ReplaySubject
오늘은 나머지 PublishSubject와 ReplaySubject에대해서 알아 볼 것이다.
이전 2개의 클래스는 이전 글 포스트에 있으니깐
궁금한 사람은 이전 글 포스트에서 확인 해주면 감사하겠당^^
PublishSubject 클래스
PublishSubject 클래스는 가장 평범한 Subject클래스이다. 구독자가 subscribe() 함수를 호출하면 값을 발행하기 시작한다.
해당 시간에 발생한 데이터를 그래대로 구독자에게 전달한다.
위의 마블다이어그램은 PublishSubject이고, 처리 순서를 알아보자
- 1.첫번째 구독자가 subscribe() 함수를 호출한다.
- 2.이후에 '빨간 원', '초록 원' 데이터를 발행하게 된다.
- 3.두번째 구독자가 subscribe()을 하게된다.
- 4.'파란색 원' 데이터를 발행하게 되고 완료가된다.
즉 첫번째 구독자는 Subject 클래스가 발행한 '빨간색 원', '초록색 원', '파란색 원' 데이터를 모두 전달 받고,
두번째 구독자는 구독한 이후 발행되는 데이터인 '파란색 원' 만 전달받게 된다.
위의 마블다이어그램은 완료지못하고 에러가 나서 에러알림을 받은 그림이다.
아래 코드 예제를 보자
val subject: PublishSubject<String> = PublishSubject.create()
subject.subscribe { data ->
Log.d("Subscriber #1", "data: $data")
}
subject.onNext("1")
subject.onNext("2")
subject.subscribe { data ->
Log.d("Subscriber #2", "data: $data")
}
subject.onNext("3")
subject.onComplete()
// Subscriber #1 -> data: 1
// Subscriber #1 -> data: 2
// Subscriber #1 -> data: 3
// Subscriber #2 -> data: 3
위 코드를 실행하게 되면 Subscriber #1
의 data
에는 '1', '2', '3'이 전달되고,Subscriber #2
의 data
에는 마지막 '3'만 전달된다.
ReplaySubject클래스
ReplaySubject클래스는 가장 특이하고 사용할 때 주의가 많이 필요한 클래스이다.
우리가 Subject 클래스를 사용하는 이유가 Cold Observable을 Hot Observable로 변환하여 사용하기 위한 것인데....
이 클래스는 Cold Observable 처럼 동작하기 때문이다.
ReplaySubject는 구독자가 새로 생기면 항상 데이터를 처음부터 끝까지 발행해 주는 클래스이다.
그러므로 모든 데이터의 내용을 저장해두는 과정에서 메노리 누수가 발생할 수 있다는 가능성을 염두해 두어야된다.
ReplaySubject의 마블 다이어그램은 위와 같은 그림으로 표현된다.
- 첫번째 구독자가 subscribe() 함수를 호출하면 '빨간 원', '초록 원'이 발행된다.
- 두번째 구독자는 subscribe() 함수를 호출하면 그 전에 발행했던 '빨간 원', '초록 원'이 발행되고,
- 나중에 발행한 '파란 원'을 두 구독자 모두 발행하면서 완료된다.
즉 모든 구독자가 모든 데이터 발행이되고 완료되는 것이다.
아래 코드는 예제 코드이다.
val subject = ReplaySubject.create<String>()
subject.subscribe { data ->
Log.d("Subscriber #1", "data: $data")
}
subject.onNext("1")
subject.onNext("3")
subject.subscribe { data ->
Log.d("Subscriber #2", "data: $data")
}
subject.onNext("5")
subject.onComplete()
// 결과는
//Subscriber #1: data: 1
//Subscriber #1: data: 3
//Subscriber #2: data: 1
//Subscriber #2: data: 3
//Subscriber #1: data: 5
//Subscriber #2: data: 5
자 오늘까지 해서 Subject 클래스에 대해서 알아봤다 다들 도움이 되었으면 좋겟다. 그리고 더 자세한 내용은 Rxjava 공페이지에서 찾아보는것을 추천한다. 꼭 찾아보자!!
'TIL > 스터디' 카테고리의 다른 글
hilt가 무엇인디? (3) | 2024.02.27 |
---|---|
안드로이드 Task(간단 포스트) (0) | 2024.02.26 |
Subject 클래스(AsyncSubject, BehaviorSubject) (0) | 2024.02.21 |
Hot Observable vs Cold Observable (2) | 2024.02.20 |
RxJava (2) | 2024.02.15 |