아래 내용은 let us: Go! 2017 'Functional Reactive Programming 패러다임' 발표 내용을 정리한 글입니다.

 


Contents

  1. Programming
  2. Paradigm (패러다임)
  3. Functional
    1) Immutable
    2) Pure function (순수 함수)
    3) Generator, Function, Consumer, Composition
    4) High-Order function, First Class Citizen
    5) Imperative Programming(명령형 프로그래밍) vs Declarative Programming(선언형 프로그래밍)
  4. Reactive

Summary

  • Functional: (Concurrent 시대에 여러 프로그램이 동시에 돌아가기 위해서 외부에 영향을 주지 않아야 하기 때문에 )
    Side-Effect가 없도록 프로그래밍 하는 패러다임
  • Reative:
    Async한 작업을 Functional하게 처리하는 아이디어
  • RxSwift:
    Reactive 아이디어를 구현한 Swift 라이브러리

 

1. Programming

Input으로 Output을 만드는 것, Output을 만드는 과정을 프로그래밍

 

 

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.

Observable은 데이터를 만드는 타입. 데이터가 흘러가는 사이에 Operator를 통해서 데이터를 변형 또는 조작이 이루어짐.
getText에 url을 넣으면 Stream을 리턴하는 것. 통신을 마치고 데이터를 스트림을 통해서 원하는 곳에 전달이 된다.

Reactive Summary

  • Async한 처리를 Functional하게 처리하자
  • 리턴값은 Stream인 Observable을 반환하자
  • Stream에 흐르는 Data/Event를 Operator로 처리하자
  • Stream과 Stream을 연결하자
  • Data가 아닌 Process에 집중해서 프로그램을 만들자

 

 

 

 

 

Ref.

https://iamchiwon.github.io/2017/11/04/frpp/

 

Functional Reactive Programming Paradigm

let us: Go! 2017 가을 세미나에서 발표한 내용

iamchiwon.github.io

 

 

 

+ Recent posts