아래 내용은 let us: Go! 2017 'Functional Reactive Programming 패러다임' 발표 내용을 정리한 글입니다.
Contents
- Programming
- Paradigm (패러다임)
- Functional
1) Immutable
2) Pure function (순수 함수)
3) Generator, Function, Consumer, Composition
4) High-Order function, First Class Citizen
5) Imperative Programming(명령형 프로그래밍) vs Declarative Programming(선언형 프로그래밍) - Reactive
Summary
- Functional: (Concurrent 시대에 여러 프로그램이 동시에 돌아가기 위해서 외부에 영향을 주지 않아야 하기 때문에 )
Side-Effect가 없도록 프로그래밍 하는 패러다임 - Reative:
Async한 작업을 Functional하게 처리하는 아이디어 - RxSwift:
Reactive 아이디어를 구현한 Swift 라이브러리
1. Programming
2. Paradigm(패러다임)
정의
어떤 한 시대 사람들이 견해나 사고를 근본적으로 규정하고 있는 테두리로서의 인식의 체계, 또는 사물에 대한 이론적인 틀이나 체계를 의미하는 개념 (by 위키백과)
(동시대를 살아가고 있는 사람들이 같은 생각을 가지고 있는 것 - 그 시대를 반영함)
시대 | Low Memory | Mass Production | Concurrency |
특징 | Low Memory Optimized Data : Program = 1 : 1 |
Medium Memory Resuable Abstract Data |
High Memory Performance / Responsibility Concurrency |
설명 | - 최적화가 목표 | - 프로그래밍 대량 생산해야 하는 시대 - 데이터 처리 재사용성을 높이는 방법과 클래스화, 추상화를 하여 재사용성을 높이는 새로운 패러다임이 생김 |
- 동시에 여러개인 프로그램이 실행되야 하는 시대 : 프로그램이 동시에 여러 인스턴스로 실행됨 - 프로그램이 다른 프로그램의 영향을 주면 안됨 : Performance, 신뢰성 중요 |
3. Functional
Immutable, Pure function, Composition, High-Order function, first class citizen 등 이와 같은 용어가 왜 생겨나게 되었는지 살펴보자.
1) Immutable
- 데이터 공유에 대한 문제점을 해결하고자 값을 쓰지 못하게 하는 Immutable 용어 등장
- Concurrency 시대에서 데이터를 여러 프로그램(인스턴스)이 동시에 읽고 쓰는 문제가 생김. (Read는 문제가 없지만 Write에 문제가 있음)
- 전 시대에는 synchronize를 걸고, 세마포어나 뮤텍스를 사용하여 동기화를 맞추는 방법으로 해결함
- 요즘 modern language들은 못쓰는 변수 제공 : "Immutable" (ex. Swift Langauge의 let)
2) Pure function (순수 함수)
- Pure function(순수 함수): 외부 변수를 사용하지 않고 파라미터로 값을 만들고 새로운 값을 리턴하는 함수
- 배경: Concurrency 시대에 값을 공유함으로써 Side-Effect가 생김 (외부 변수에 문제가 생기기 때문에 Side-Effect라고 부름)
- 결론: 순수함수를 사용하자. (high memory 시대니까 메모리는 걱정 없으니까 side-effect를 줄이기 위해서)
3) Generator, Function, Consumer, Composition
- 함수 종류의 용어 정리
- Generator: Output만 존재하는 함수
- Function: Input, Output이 존재하는 함수
- Consumer: Input만 존재하는 함수
- (Ref. Submodule, Action: Input, Output이 없는 함수)
- Composition (함수의 합성) : 함수와 함수를 섞어서 사용하는 것을 뜻함.
4) High-Order function, First Class Citizen
- High-Order function (고차 함수):
함수가 파라미터로 전달되는 될 때, 함수 안에서 함수가 사용되는 것이 2개면 2차 함수, 3개면 3차함수, 여러개면 고차함수. - First Class Citizen (일급 개체):
변수에 담거나 리턴값으로 사용할 수 있거나, Array에 담을 수 있는 것을 일급 개체라고 함. - Funtional Language: Function 자체를 일급 개체화 할 수 있는 언어
- Swift는 Multi-Paradigm Language : Function, Protocol, Struct를 일급개체화 할 수 있으므로.
(Ref. 자바는 Object를 일급개체화 하므로 OOP)
5) Imperative Programming(명령형 프로그래밍) vs Declarative Programming(선언형 프로그래밍)
- 특별한 기술이 아니고 기존에 있던 방식으로 function 방식으로 프로그래밍을 하면 Functional Programming인 것.
- 생각의 주체를 데이터에 두느냐 함수에 두드냐 생각의 관점이 옮겨짐 => 패러다임
6) 'Functional' Summary
- 데이터는 immutable하게 취급하자
- 데이터 변경이 필요할 때는 새로 만들자
- Side-Effect를 없애기 위해서 Pure function을 사용하자
- Function들의 Composition과 High-Order Function으로 프로그램을 만들자
- Data가 아닌 Process에 집중해서 프로그램을 만들자
4. Reactive
- Async job, Expensive job : Callback or Delegate pattern으로 주로 사용
- 배경: Async한 상황에서 async한 데이터를 어떻게 처리할 것이냐! 로 개념이 나오게 됨.
- 결론: 스트림을 만들고 거기에 데이터를 흘려보내자,
Reactive 정의
In computing, reactive programming is an asynchronous programming paradigm concerned with data streams and the propagation of change.
Reactive Summary
- Async한 처리를 Functional하게 처리하자
- 리턴값은 Stream인 Observable을 반환하자
- Stream에 흐르는 Data/Event를 Operator로 처리하자
- Stream과 Stream을 연결하자
- Data가 아닌 Process에 집중해서 프로그램을 만들자
Ref.
https://iamchiwon.github.io/2017/11/04/frpp/