View

728x90

오늘 다루어볼 것!!

이번에 다루어 볼내용은 저번에 다루었던 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 #2data에는 마지막 '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 #1data에는 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
Share Link
reply
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30