본문 바로가기

프로그래밍/RxJava

[RxJava]Observable - just()함수

just()함수

just() 함수는 인자로 넣은 데이터를 차례로 발행하려고 Observable을 생성한다.(실제 데이터의 발행은 subscribe() 함수를 호출해야 시작한다. 한개의 값을 넣을 수도 있고, 인자로 여러 개의 값을(최대 10개) 넣을 수가 있다. 단, 타입이 같아야한다.

 

just() 마블 다이어그램

import io.reactivex.Observable;


public class FirstExample {
	public void emit() {
		Observable.just(1,2,3,4,5,6)
		.subscribe(data -> System.out.println(data));
	}
	
	public static void main(String args[])
	{
		FirstExample demo = new FirstExample();
		demo.emit();
	}
}
결과값 
1 
2 
3 
4 
5 
6

위의 코드는 Observable.just()1부터 6까지Integer 타입의 데이터를 넣고 차례대로 출력하는 예제이다.

subscribe() 함수와 Disposable 객체

RxJava내가 동작시키기 원하는 것을 사전에 정의해둔 다음 실제 그것이 실행되는 시점을 조절할 수 있다.

이때 사용하는 것이 subscribe() 함수이다. (마지막 줄에서 설명)

Observablejust()등의 팩토리 함수로 데이터 흐름을 정의한 다음, subscribe()함수를 호출해야 실제로 데이터를 발행한다.

 

* RxJava는 선언형 프로그래밍을 지향한다.

선언형 프로그래밍은 명령형 프로그래밍의 반대말로 어떤 방법으로 동작하는가가 아닌, 프로그래밍할 대상이 무엇인지 알려주는 것을 의미한다.

예를 들어서, 명령형 프로그래밍 언어에서는 실행할 알고리즘과 동작을 구체적으로 명시한다.

하지만 선언형 프로그래밍은 목표를 명시할 뿐 실행할 알고리즘을 명시하지 않는다.

 

*subscribe() 함수에는 각각 의미가 있다.

1. 인자가 없는 경우 : onNext()와 onComplete 이벤트를 무시하고, onError 이벤트가 발생했을 때만 onErrorNotImplementedException을 던진다.(throw), 따라서 Observable로 작성한 코드를 테스트하거나, 디버깅할때 활용한다.

2. 인자가 1개 있는 경우 onNext와 onError 이벤트를 처리한다.

3. 인자가 2개 있는 경우 onNext와 onError 이벤트를 처리한다.

4. 인자가 3개 있는 함수는 onNext, onError, onComplete 이벤트를 모두 처리할 수 있다.

위의 함수 원형은 모두 Disposable 인터페이스 객체를 리턴하게 된다. Disposable은 RxJava1.x의 Subscription(구독)객체에 해당된다.

 

Disposable 인터페이스 객체에는 아래와 같이 두가지 함수가 존재한다.

void dispose() 
boolean isDisposed()

위의 두가지 함수가 존재한다.

먼저 dispose()는 Observable에게 더 이상 데이터를 발행하지 않도록 구독을 해지하는 함수이다.

Observable Contract에 따르면 Observable이 onComplete 알림을 보냈을 때 자동으로 dispose()를 호출해서 Observable과 구독자의 관계를 끊게 된다. (즉, onComplete 이벤트가 정상적으로 발생했다면, 구독자가 별도로 dispose()를 호출할 필요가 없다)

isDisposed()는 Observable이 데이터를 발행하지 않는지(구독을 했는지) 확인하는 함수이다.

Observable<String> source = Observable.just("RED","GREEN","YELLOW");
		
		Disposable d = source.subscribe(
				v -> System.out.println("onNext() : value : " + v),
				err -> System.err.println("onError() : err : " + err.getMessage()),
				() -> System.out.println("onComplete()"));
		
		System.out.println("isDisposed() : " + d.isDisposed());
결과값

onNext() : value : RED
onNext() : value : GREEN
onNext() : value : YELLOW
onComplete()
isDisposed() : true

위의 코드는 just()함수에 'RED","GREEN","YELLOW"를 차례대로 발행하기 위해서 넘겨주고

subscribe()를 하게 된다. 그렇게 Observable이 데이터를 발행하도록하고, 발행이 완료되면 onComplete이벤트가 발생하면서 dispose()된다. 그렇기에, isDisposed()true값이 출력이 된다.

 

* 위와 같은 코드에서 보듯이 Observable.just()로 내가 동작시킬것을 미리 선언을 해두고, source.subscribe()를 통해서 실행시점을 조절하고 있다.

그림 출처 : http://reactivex.io/documentation/operators/just.html