개발 공부/안드로이드
[RxJava] RxJava란
Dev.Jun
2018. 7. 4. 13:42
Reactive X (RxJava)
RxJava는 옵저버 패턴을 기반으로 작동하기 때문에 자바 옵저버 패턴에 대한 선행학습은 필수적으로 이뤄져야 한다. 또한 람다식(Lambda Expressions)을 익혀둘 필요가 있다.
1. Observer pattern
옵저버 패턴에서는 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들에게 연락이 가고, 자동으로 내용이 갱신되는 방식으로 '일대다(one-to-many) 의존성'을 정의한다.
- 아래 UML을 통해 Observer pattern 구현 시, 클래스들의 관계를 알 수 있다.
1.1. Loose Coupling
Loose Coupling 객체 간에 서로 상호작용이 이뤄지지만 서로에 대해 잘 모르는 상태를 말한다.
- 주제가 옵저버에 대해서 아는 것은 옵저버가 특정 인터페이스(Observer interface)를 구현한다는 것 뿐이다.
- 옵저버는 언제든지 새로 추가할 수 있다.
- 새로운 형식의 옵저버를 추가하려고 할 때도 Subject를 전혀 변경할 필요가 없다.
- 주제와 옵저버는 서로 독립적으로 재사용할 수 없다.
- 주제나 옵저버나 바뀌더라도 서로한테 영향을 미치지 않는다.
2. Lambda Expressions
람다식은 익명 함수를 생성하기 위한 식으로 객체 지향 언어보다는 함수 지향 언어에 가깝다.
2.1. 람다식을 사용하는 이유
- 코드의 간결성
- 컬렉션의 요소를 필터링하거나 매핑하여 원하는 결과를 쉽게 얻을 수 있음
- 람다식의 형태는 매개 변수를 가진 코드 블록이지만, 런타임 시에는 익명 구현 객체를 생성한다.
2.2. 람다식의 기본 문법
/* 기본형 */
(타입, 매개변수) -> { 실행문; }
/* 예시 */
// 1. 기본형
(int a) -> {System.out.println(a);}
// 2. 매개변수 타입 생략
(a) -> {System.out.println(a);}
// 3. 하나의 매개변수만 있다면 괄호() 생략 가능, 하나의 실행문만 있다면 중괄호{}도 생략 가능
a -> System.out.prinlnt(a);
/* 매개변수가 아예 존재하지 않을 경우 */
() -> { 실행문; }
/* 결과값을 리턴해야할 경우 */
(a, b) -> {return a + b;}
/* 중괄호에 리턴문만 있을 경우 */
// 중괄호와 return 생략 가능
(a, b) -> a + b
// 1. 자바 코드
Runnable runnable = new Runnable(){
public void run(){ /* 로직 */ }
};
// 2. 람다식
Runnable runnable = () -> { /* 로직 */ };
3. RxJava
- 비동기, 이벤트 기반 프로그램을 작성하기 위한 라이브러리
- 스트림을 사용한다.
RxJava는 자바와 안드로이드를 위한 리액티브 프로그래밍 구현체로서 함수형 프로그래밍의 영향을 받았다. 따라서 함수 구성을 선호하며 전역 상태나 부수효과를 피하고 비동기나 이벤트 기반 프로그램을 작성할 때 스트림 방식으로 생각한다.
2.1. RxJava 필수 개념
2.1.1. Observer
옵저버는 Observable을 구독하며 '구독자'나 '관찰자' 또는 '리액터'라고 불려지고 있지만, 통상적으로 이 모델은 리액터 패턴을 의미한다.
2.1.2. Observable
Observable은 emitt(발신, 방출)하는 주체이다.
RxJava에서 옵저버는 Observable을 구독한다. Observable이 방출하는 하나 또는 연속된 항목에 옵저버는 반응하게 된다.
- Observable은 항목들을 배출하거나 observable의 메서드 호출을 통해 옵저버에게 알림을 보낸다.