# 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