티스토리 뷰

Reactive

[Reactive] Iterable과 Observable

joeylee 2020. 11. 27. 22:10

목표

Iterable과 Observable을 사용해 1부터 10까지 출력하는 어플리케이션 개발을 합니다

Iterable과 Observable 의 쌍대성(duality)에 대해서 알아봅니다

Iterable

Iterable은 Collection 인터페이스에서 구현하고 있는 인터페이스로 내부의 원소들을 순회할 수 있게 만든 interface 입니다

iterator.next() 를 해서 데이터를 가져오는 방식입니다(pull 방식)

//메인 안의 메소드
Iterable<Integer> iter = () ->
              new Iterator() {

                  int i = 0;
                  final static int MAX = 10;

                  @Override
                  public boolean hasNext() {
                      return i < MAX;
                  }

                  @Override
                  public Object next() {
                      return ++i;
                  }
              };

for(Integer i : iter) {
    System.out.println(i);
}

for(Iterator<Integer> it = iter.iterator(); it.hasNext();) {
    System.out.println(it.next()); //pull 방식
}

Observable

Observable 이벤트 소스라고 생각하면 됩니다

Observable에서 이벤트가 발생되면 Observer에서 받는 방식(push 방식)

static class IntObservable extends Observable implements Runnable {
      @Override
      public void run() {
          for(int i=1; i<=10; i++) {
              setChanged();
              notifyObservers(i); //push 방식
          }
      }
  }
//메인 안의 메소드
Observer ob = new Observer() {
            @Override
            public void update(Observable o, Object arg) {
                System.out.println(Thread.currentThread().getName() + " " + arg);
            }
        };

IntObservable io = new IntObservable();
io.addObserver(ob);

ExecutorService es = Executors.newSingleThreadExecutor();
es.execute(io);

System.out.println(Thread.currentThread().getName() + " EXIT");
es.shutdown();

위의 Observer 패턴의 문제점

  1. complete 시점을 알수가 없다
  2. error 시점에 처리하는 로직이 존재하지 않는다(직접구현)

다음 글에서는 표준 Reative Streams 에서 제공해주는 API를 통해서 위의 Observer 패턴의 단점을 보완한 Observer패턴을 만들어봅니다

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함