View
오늘 다루어볼 것!!
이번에 다루어 볼내용은 저번에 다루었던 Hot Observable vs Cold observable
에서 나온 Subject 클래스에 대해서 다루어 볼것이다.
저번 스포트에서 이어진 내용이라고 봐도 무방하당^^
자 이제 Subject클래스가 뭔지 알아보자
Subject 클래스?
Subject 클래스가 무엇일까?
Subject 클래스는 Hot Observable의 대표적인 클래스 중 하나로 Cold Observable을 Hot Observable로 변환해주고 Observable 속성과 Subscriber(구독자)의 속성을 모두 가지고 있다. 그래서 Observable처럼 데이터를 발행하고 구독자처럼 발행된 데이터를 바로 처리할 수 있다.
Subject에는 여러 종류가 있는데, 이제부터 천천히 어떤게 있고 어떤 특징이 있는지 알아보자~~!
- Subject 종류
- AsyncSubject
- BehaviorSubject
- PublishSubject
- ReplaySubject
AsyncSubject 클래스
AsyncSubject 클래스는 Observable에서 발행한 마지막 데이터를 얻어올 수 있는 Subject 클래스이다.
즉 Observable에서 발행한 마지막 데이터를 얻어올 수 있으며, 완료되기 전 마지막 데이터만 남고 이전 데이터들은 무시된다.
위의 마블다이어그램에서 보면 시간 표시줄이 여러개인것을 볼 수 있고 처리 되는 순서는 다음과 같다.
- 1.처음 구독자가 subscribe() 함수를 호출한다.
- 2.이후에 '빨간 원', '초록 원' 이 발행된 후 두번째 구독자가 subscribe()함수를 호출한다.
- 3.마지막으로 '파란 원'이 발행된 후 데이터 발행을 완료(oncomplete 이벤트)한다.
여기서 완료가 되기 전까지 구독자에게 데이터를 전달하지 않다가
완료가됨과 동시에 첫 번째와 두 번째 구독자에게 마지막 데이터를 발행하고 종료한다.
위의 마블다이어그램은 완료지못하고 에러가 통지된 그림이다.
아래 코드 예제를 보자
val subject: AsyncSubject<String> = AsyncSubject.create()
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()
// data는 "5"만 전달됨
위 코드를 실행하게 되면 onComplete() 되기 전 마지막 onNext()의 값만 처리된다.
즉 두 가지 Subscriber #1
, Subscriber #2
의 data
에는 마지막 '5'만 전달된다.
아래 코드의 경우는 Observable의 구독자로 동작한 예제이다.
val tempArray = arrayOf(10, 18, 27)
val source = Observable.fromArray(tempArray)
val subject = AsyncSubject.create<Array<Int>>()
subject.subscribe { data ->
Log.d("Subscriber #1", "data: $data")
}
source.subscribeWith(subject)
// data는 27 만 찍힘
위 코드를 실행 후 Subscriber #1
의 data
에는 27만 찍힌다.
정수 데이터를 담은 observable을 생성하고
Observable 타입의 변수 이름은 source이다.
subject 변수에 AsyncSubject 객체를 생성하고 data를 수신할 수 있도록 subscribe() 함수를 호출한다.
마지막으로 subject 변수는 observable인 source를 구독한다.
BehaviorSubject클래스
BehaviorSubject클래스는 구독자가 구독을 하면 가장 최근 값 혹은 기본값을 넘겨주는 클래스이다.
그래서 기본값을 처음에 설정해주 줄 수 있습니다.
-> ex) BehaviorSubject.creatDefault("0"), BehaviorSubject.create("0")
BehaviorSubject의 마블 다이어그램은 위와 같은 그림으로 표현된다.
- 핑크색원은 BehaviorSubject 클래스를 생성할 때 넘긴 초깃값이 된다.
- 첫번째 구독자는 초깃값인 핑크색 원을 받고 다음에 빨간색 원부터 수신하게 된다.
- 두번째 구독자는 초록색 원이 발행된 이후에 구독했으므로, 초록색 원을 맨 처음 전달한다.
만약 오류와 함께 종료되면 BehaviorSubject는 후속 관찰자에게 아이템을 방출하지 않고 오류 알림을 전달하기만 한다.
아래 코드는 예제 코드이다.
val subject = BehaviorSubject.createDefault("6")
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: 6 // "1" 발행 전 기본값 전달
Subscriber #1: data: 1
Subscriber #1: data: 3
Subscriber #2: data: 3 // subscribe 하기 직전 (가장 최근) 값 전달
Subscriber #1: data: 5
Subscriber #2: data: 5
BehaviorSubject 클래스는 AsyncSubject클래스와 다르게 createDefault()함수로 생성한다.
구독자가 subscribe() 함수를 호출했을 때, 그전까지 발행한 값이 없다면 기본값을 대신 발행해야하기 때문이다.
구독자가 subscribe() 함수를 호출 전에 발행한 값이 없기 때문에 기본값인 6 이 먼저 발행된다.
그리고 첫번째 구독자가 subscribe() 함수를 호출하면 차레로 1,3 이 발행된다.
두번째 구독자가 subscribe() 함수를 호출하면 바로 전에 발행한 3 을 맨 처음에 전달받는다.
그리고 5 를 모든 구독자에게 발행하게 된다.
**나머지 두개는 생각보다 내용이 길어져서 다음 시간에 포스팅 하겠당.^^**
'TIL > 스터디' 카테고리의 다른 글
hilt가 무엇인디? (3) | 2024.02.27 |
---|---|
안드로이드 Task(간단 포스트) (0) | 2024.02.26 |
Subject 클래스(PublishSubject, ReplaySubject) (0) | 2024.02.22 |
Hot Observable vs Cold Observable (2) | 2024.02.20 |
RxJava (2) | 2024.02.15 |