![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/DyX8f/btqFMHeSsYj/RMUnBEpvu020RsmDF2Uf31/img.jpg)
변환 연산자 데이터 흐름을 원하는 대로 변형할 수 있습니다. concatMap flatMap와 매우 비슷합니다. flatMap은 먼저 들어온 데이터를 처리하는 도중에 새로운 데이터가 들어오면 나중에 들어온 데이터의 처리 결과가 먼저 출력될 수도 있습니다. 하지만 concatMap은 먼저 들어온 데이터 순서대로 처리해서 결과를 낼 수 있도록 보장합니다. 입력 import common.CommonUtils import common.Log import io.reactivex.Observable import java.util.concurrent.TimeUnit class ConcatExample { fun marbleDiagram() { CommonUtils.start() val balls = arrayOf("..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/cndud0/btqFLhgD27e/K1yQV1vQiPBNbxtpYIstW1/img.png)
위젯은 화면에 표시되는 것이라고 생각하면 됩니다. 모든 화면 표시와 사용자 상호작용에 위젯을 사용하기 때문입니다. 위젯은 크게 Stateless 위젯과 Stateful 위젯으로 구별합니다. Stateless 위젯 화면 표시용 위젯입니다. 위젯이 로딩되어 화면에 표시된 이후에는 사용자 이벤트나 동작이 있어도 내용을 변경할 수 없습니다. import 'package:flutter/material.dart'; void main() => runApp(MaterialApp( title: 'Stateless Widget', home: Scaffold( appBar: AppBar(title: Text('Stateless 위젯')), body: _FirstStatelessWidget(), ), )); class _Fi..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/eCAs5F/btqFIOtElvH/XLJkK9e9RCJ5x8KjTw8pNK/img.png)
구조 확인하기 플러터는 모든 코드가 lib 폴더에서 관리됩니다. 코드 살펴보기 import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData( primarySwatch: Colors.blue, ), home: MyHomePage(title: 'Flutter Demo Home Page'), ); } } import는 flutter의 material UI를 의미합니다. ios 스타일의 위..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/qslWp/btqFyQRFSIU/knixOGYSdkFdyA2Mko1Db1/img.png)
생성 연산자 생성 연산자의 역할은 데이터 흐름을 만드는 것이다. 간단하게 Observable을 만든다고 생각하면 됩니다. interval 일정 시간 간격으로 데이터 흐름을 생성합니다. 주어진 시간 간격으로 0부터 1 씩 증가하는 Long 객체를 발행합니다. interval 함수는 기본적으로 영원히 지속 실행되기 때문에 폴링 용도로 많이 사용합니다. 입력 class IntervalExample { fun printNumber() { CommonUtils.start() val source = Observable.interval(100, TimeUnit.MILLISECONDS) .map { data -> (data + 1) * 100 } .take(5) source.subscribe { data -> Log...
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/pGrFV/btqFypzdkt4/YcPYkkcpX5PFEldfvKJwJk/img.png)
Reduce 발행한 데이터를 모두 사용하여 어떤 최종 결과 데이터를 합성할 때 활용합니다. 보통 Observable에 입력된 데이터를 필요한 map 함수로 매핑하고, 원하는 데이터만 추출할 때는 불필요한 데이터를 걸러내는 filter 함수를 호출합니다. 또한 상황에 따라 발행된 데이터를 취합하여 어떤 결과를 만들어낼 때는 reduce 함수를 사용합니다. 아래는 마블 다이어그램의 코드입니다. 입력 import io.reactivex.Observable class ReduceExample { fun marbleDiagram() { val balls = arrayOf("1", "3", "5") val source = Observable.fromArray(*balls) .reduce{ ball1, ball2 -..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/pwWNO/btqFxzPSCVS/fJIdvuKLkJYYYkz41N09ok/img.png)
Filter Observable에서 원하는 데이터만 걸러내는 역할을 합니다. 즉, 필요 없는 데이터는 제거하고 오직 관심 있는 데이터만 filter 함수를 통과하게 됩니다. 위 다이어그램을 보면 원 만 통과시키는 것을 볼 수 있습니다. 입력 import io.reactivex.Observable class FilterExample { fun marbleDiagram() { val objs = arrayOf("1 CIRCLE", "2 DIAMOND", "3 TRIANGLE", "4 DIAMOND", "5 CIRCLE", "6 HEXAGON") val source = Observable.fromArray(*objs) .filter { obj -> obj.endsWith("CIRCLE") } source.su..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/8ZfIX/btqFxAgZpGZ/FuPuN7NKXJRVA83RfI8rSK/img.png)
FlatMap FlatMap 함수는 Map 함수를 발전시킨 함수이다. FlatMap 함수는 결과가 Observable로 나옵니다. Map 함수가 일대일 함수라면 FlatMap 함수는 일대다 혹은 일대일 Observable 함수입니다. 빨간색 원을 넣으면 첫 번째 빨간색 다이아몬드, 두 번째 빨간색 다이아몬드가 나온다. 초록색 원을 넣으면 같은 방식으로 첫 번째 초록색 다이아몬드, 두 번째 초록색 다이아몬드가 나온다. 위와 같이 FlatMap 함수는 결과 값이 Observable이므로 여러 개의 데이터를 발행할 수 있습니다. 입력 import io.reactivex.Observable class FlatMapExample { fun marbleDiagram() { val getDoubleDiamonds =..