관리 메뉴

나만을 위한 블로그

[Rxjava] Observable이란? - 2 - 본문

개인 공부/Rxjava

[Rxjava] Observable이란? - 2 -

참깨빵위에참깨빵 2021. 5. 26. 17:25
728x90
반응형

이전 포스팅에서 Observable에 대해 살펴봤으니 이 포스팅에선 관련된 예제를 확인한다

 

먼저 Cold Observable의 예제다.

import io.reactivex.rxjava3.core.Observable;

import java.util.concurrent.TimeUnit;

public class Main
{
    public static void main(String[] args)
    {
        coldObservableText();
    }

    public static void coldObservableText()
    {
        Observable<Long> observable = Observable.interval(1, TimeUnit.SECONDS);
        observable.subscribe(item -> System.out.println("Observer 1 : " + item));
        try
        {
            Thread.sleep(3000);
        }
        catch (InterruptedException e)
        {
            e.printStackTrace();
        }
        observable.subscribe(item -> System.out.println("Observer 2 : " + item));
        try
        {
            Thread.sleep(5000);
        }
        catch (InterruptedException e)
        {
            e.printStackTrace();
        }
    }

}

 

위 코드를 실행하면 아래와 같은 결과가 나온다.

결과는 항상 다르게 나온다

observable.interval()과 그 안의 인자들 때문에 1초마다 숫자들이 하나씩 출력되는 것 같다.

잘 보면 Observer 1은 0부터 7까지 출력되지만 Observer 2는 0부터 4까지만 출력된다.

당연한 이야기지만 Observer 1은 처음부터 출력하기 시작한 반면 Observer 2는 1보다 3초 뒤에 subscribe()로 구독을 시작했기 때문에 이런 차이가 나오는 것이다.

 

다음은 Hot Observable의 예제다.

import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.observables.ConnectableObservable;

import java.util.concurrent.TimeUnit;

public class HotObservableMain
{
    public static void main(String[] args) throws InterruptedException
    {
        hotObservableTest();
    }

    private static void hotObservableTest() throws InterruptedException
    {
        Observable<Long> observable = Observable.interval(1, TimeUnit.SECONDS);
        ConnectableObservable<Long> connectableObservable = observable.publish();

        connectableObservable.subscribe(item -> System.out.println("Observer 1 : " + item));
        connectableObservable.connect();
        Thread.sleep(3000);

        connectableObservable.subscribe(item -> System.out.println("Observer 2 : " + item));
        Thread.sleep(5000);
    }
}

위 코드를 실행하면 아래와 같이 작동한다.

Cold Observable과는 달리 Observer 1이 먼저 발행을 시작하다가 3초가 지나면 Observer 2가 아이템 발행을 시작하는 걸 볼 수 있다.

Cold Observable과의 차이라면 역시 Hot Observable의 경우 나중에 구독한 옵저버는 구독한 그 순간부터의 데이터만 다룰 수 있다는 것이다. 위의 Cold Observable은 늦게 구독한 옵저버도 처음부터 끝까지 모든 데이터를 다루는 것을 볼 수 있다.

반응형
Comments