본문 바로가기

RxJava

[RxJava] 생성 연산자

안녕하세요. 메로나입니다.

 

오늘은 RxJava에서 생성 연산자에 대해 공부하겠습니다.

 

Iterval 연산자
  • 지정한 시간 간격마다 시작하는 숫자를 통지합니다.
  • initalDelay 파라미터 이용해서 최초 통지에 대한 대기 시간을 지정할 수 있습니다.
  • 호출한 스레드와는 별도의 스레드에서 진행됩니다. 즉. main 스레드에서 진행되지 않습니다.
@SuppressLint("CheckResult") // RxJava에서 반환된 데이터를 사용하지 않을 때 필요한 어노테이션
    public static void main(String[] args) {
        try {
            Observable.interval(0L, 1000L, TimeUnit.MILLISECONDS)
                    .map(num -> num + " count")
                    .subscribe(System.out::println);

            Thread.sleep(3000); // 메인 쓰레드가 끝나지 않도록 하기 위한 코드
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

// 출력
0 count
1 count
2 count
3 count

 

Range 연산자
  • 지정한 값(n)부터 m개의 숫자를 통지할 수 있습니다.
  • for, while문 등의 반복문을 대체할 수 있습니다.
@SuppressLint("CheckResult")
    public static void main(String[] args) {
        Observable<Integer> source = Observable.range(1, 10);
        source.subscribe(System.out::println);
    }
    
// 출력
1
2
3
4
5
6
7
8
9
10

 

Timer 연산자
  • 지정한 시간이 지나면 데이터를 통지합니다.
  • 데이터를 통지하고 onComplete() 이벤트가 발생하여 종료합니다.
  • 호출한 스레드와는 별도의 스레드에서 실행됩니다.
  • 특정 시간을 대기한 후에 어떤 처리를 하고자 할 때 활용합니다.
  @SuppressLint("CheckResult")
    public static void main(String[] args) {
        System.out.println("시작");
        Observable<String> observable =
            Observable.timer(2000, TimeUnit.MILLISECONDS)
                .map(count -> "End"); // 끝나면 print End

        observable.subscribe(System.out::println);

        try {
            // 스레드가 다르기 때문에 메인 스레드가 종료되지 않게 하기 위해
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

// 출력
시작
Hello Timer

 

defer 연산자
  • 구독이 발생할 때마다 즉 subscribe()가 호출될 때마다 새로운 observable을 생성할 수  있습니다.
  • 선언한 시점의 데이터를 통지하는 것이 아니라 호출 시점의 데이터를 통지할 수 있습니다.
  • 데이터 생성을 미루는 효과가 있기 때문에 최신 데이터를 얻고자 할 때 활용할 수 있습니다.
@SuppressLint("CheckResult")
    @RequiresApi(api = Build.VERSION_CODES.O) // LocalTime.now() 함수를 사용하기 위해 사용
    public static void main(String[] args) {
        Observable<LocalTime> defetObservable = Observable.defer(() -> Observable.just(LocalTime.now()));
        Observable<LocalTime> justObservable = Observable.just(LocalTime.now());

        defetObservable.subscribe(time -> System.out.println("deferObservable: " + time));
        justObservable.subscribe(time -> System.out.println("justObservable: " + time));

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        defetObservable.subscribe(time -> System.out.println("deferObservable: " + time));
        justObservable.subscribe(time -> System.out.println("justObservable: " + time));
    }
    
// 출력
deferObservable: 22:29:54.432856
justObservable: 22:29:54.428697
deferObservable: 22:29:55.435952
justObservable: 22:29:54.428697

 

fromIterable 연산자
  • Iterable 인터페이스를 구현한 클래스를 파라미터로 받는다.
  • Iterable에 담긴 데이터를 순서대로 통지합니다.
 @SuppressLint("CheckResult")
    public static void main(String[] args) {
        List<String> countries = List.of("Korea", "Canada", "USA", "Italy");
        Observable<String> source = Observable.fromIterable(countries);
        source.subscribe(System.out::println);
    }
    
// 출력
Korea
Canada
USA
Italy

 

 

RxJava 생성 연산자를 공부하면서 개발할 때 자주 사용할 것 같다는 생각을 많이 했던 것 같습니다.

또한 main 스레드를 사용하지 않고, 새로운 스레드를 사용하여 동작하는 것도 배웠고, 코드 길이가 줄어들어서 유지보수하기도 편해진 것 같아서 공부하면서 자주 사용해 보면서 익히려고 노력해야 할 것 같습니다.

 

이상입니다. 감사합니다.

'RxJava' 카테고리의 다른 글

[RxJava] 데이터 변환 연산자  (0) 2025.02.06
[RxJava] 데이터 필터링 연산자  (0) 2025.02.01
[RxJava] Single vs Maybe vs Completable  (0) 2025.01.27
[RxJava] Flowable과 Observable의 차이점  (0) 2025.01.23
[RxJava] Reative Streams  (0) 2025.01.22