# Table of Contents
# Subject
Subject
는 이벤트 방출과 이벤트 수신을 모두 할 수 있는 객체입니다.
예제를 살펴봅시다.
// Subject 생성
val publishSubject = PublishSubject.create<Int>()
// 구독
publishSubject
.subscribe {
// 이벤트 수신
println(it)
}
// 이벤트 방출
publishSubject.onNext(1)
publishSubject.onNext(2)
결과물은 다음과 같습니다.
1
2
Subject
에는 크게 네 가지가 있습니다.
PublishSubject
BehaviorSubject
AsyncSubject
RelaySubject
이번 포스트에서는 자주 사용하는 PublishSubject
, BehaviorSubject
에 대해 알아보겠습니다.
# PublishSubject
PublishSubject
는 다음과 같이 동작합니다.
PublishSubject
는 다음과 같이 사용합니다.
val publishSubject = PublishSubject.create<Int>()
// 구독 전 이벤트 방출
publishSubject.onNext(1)
// 구독
publishSubject
.subscribe {
println(it)
}
// 구독 후 이벤트 방출
publishSubject.onNext(2)
publishSubject.onNext(3)
결과는 다음과 같습니다.
2
3
주의할 점이 있습니다. PublishSubject
는 구독하기 전 발생한 이벤트는 수신하지 못한다는 것입니다.
# BehaviorSubject
BehaviorSubject
는 초기값을 설정할 수 있습니다.
// BehaviorSubject 생성
val behaviorSubject = BehaviorSubject.createDefault(1) // 초기값 설정
behaviorSubject
.subscribe {
println("A: ${it}")
}
behaviorSubject.onNext(2)
behaviorSubject.onNext(3)
결과는 다음과 같습니다. PublishSubject
와는 다르게 구독하기 전 방출된 초기값도 수신하고 있습니다.
A: 1 // 초기값
A: 2
A: 3
이제 두 번째 구독을 해봅시다.
// BehaviorSubject 생성
val behaviorSubject = BehaviorSubject.createDefault(1) // 초기값 설정
// 첫 번째 구독
behaviorSubject
.subscribe {
println("A: ${it}")
}
behaviorSubject.onNext(2)
behaviorSubject.onNext(3)
// 두 번째 구독
behaviorSubject
.subscribe {
println("B: ${it}")
}
behaviorSubject.onNext(4)
결과는 다음과 같습니다.
A: 1
A: 2
A: 3
B: 3
A: 4
B: 4
두 번째 구독부터는 가장 마지막으로 방출된 값을 전달받습니다.
A: 1
A: 2
A: 3 // 첫 번째 구독의 마지막 방출값
B: 3 // 두 번째 구독이 마지막으로 방출된 값을 전달받아 출력
A: 4
B: 4