Functional vs Reactive

2018. 4. 6. 03:01

- 이 자료는 Youtube 등 을 통해 학습하고 제작되었습니다

Functional Programing

과거에서부터 생겨난 문제점은, 어떠한 데이터가 있고, 동시에 코딩하는 것이다.
image

Read는 문제가 없는데, Write시 문제가 생긴다. 

그래서 나온 방법이 동시에 못쓰게 만드는 것 Immutable이다.
요즘 나오는 Modern 랭귀지들은 동시에 못쓰는 변수 let( Closer?)을 제공한다.
image


var변수 data가 바뀌면,  return값도 바뀌게 된다. 동시 접근시 문제가 될 수 있다.
let변수 data는 바뀌지 않도록 설정되어 있지만, 함수 속의 var변수 backup이 바뀐다. 동시 접근시 문제가 될 수 있다.
아래 함수들은 혼자 돌아갈 땐, 문제가 없는데, 동시에 접근하게 된다면 문제가 될 수 있다.

이렇게 let이 아닌 것들에 대해 외부적으로 변화를 초래한다고 해서 Side-Effect라고 부른다.

image


Side-Effect를 없애기 위해서, 프로그래밍 방식을 바꾸었는데,
함수내에서 사용하는 모든 변수의 값을 파라미터로 받고,  새로운 값을 만들어서 return하는 것이다.
이러한 방식을 Pure function이라고 한다.

image


함수의 종류는 딱 3가지다.
image


이러한 3가지 종류의 함수의  output과 intput을 연결하여, 각 함수들을 섞어서 쓰는 것을 Composition이라고 한다.

각 함수들은
1. input은 없고 output만 있는 것 : 생성자(Generator) - ex> get함수
2. input은 , output이 모두 있는 것 :  Function
3. input은 있는데 output은 없는 것 : Consumer ex> set함수?
image



12번 라인에서 func함수 중간에 파라미터로 함수를 받았다.
이렇게 함수안에 함수가 들어있는 것을 High-Order function(고차 함수)라고 한다.

image


자바는 Object를 변수에 담거나, ArrayList에 담을 수 있거나, return값을 사용할 수 있다.
함수까지도 이렇게 사용할 수 있는 것을 First Class Citizen(1급 객체)라고 한다.
자바는 객체만을 이러한 방식으로 사용가능 하므로, OOP언어라고 하고
Swift는 객체 뿐만 아니라, 함수, 프로토콜까지 1급 객체로 사용할 수 있으므로 멀티 패러다임 언어라고 한다.


자바로 OOP 김밥을 만들어보자.

  1. 재료인, 단무지 / 소세지/ 시금치 CLASS를 정의
  2. 공통적인 상위 클래스인 식재료 CLASS 정의
  3. 식재료class가 반드시 가져야할 변수or메소드를 포함하는 자르기interface 정의
  4. 김밥을 만들기 위해, 조리법interface / 김말기interface정의
  5. 김밥Class정의  + 식재료class상속  + 조리법, 김말기 interface 상속
    image


Functional Programing으로 김밥을 만들어보자.

  1. 자르기 interface -> 함수func로 정의
  2. 식재료들을 자르기func의 변수로 집어넣음
  3. 자르기(식재료) 함수 자체를 변수로 집어넣어서 김말기()함수를 정의

image


OOP 와 Functionl P의 차이점은
데이터를 정의하고, 변화 과정을 명령할 것이냐의 명령형 프로그래밍이냐
행위를 정의하고 데이터를 집어넣을 것이냐 의 선언형 프로그래밍이냐 이다.

- 생각의 주체를 데이터로 줬던 것에서-->  함수로 주는 것으로 패러다임이 바뀌는 것이다.
image

Functional Programming 요약
image


Reactive

Funtional Programing 하는 가운데,  url에서 text를 받아온 다고 가정하자.
async한 작업을 수행해야한다. 그것을 간단하게 해줄 수 있는 해결책이 Reactive이다.

async한 상황에서 데이터를 어떻게 처리할 것인가에 대한 대답을
stream이라는 것으로 연결하고 그것을 흘려보내는 아이디어가 Reactive이다.
그 아이디어를 구현화 한 것(Reactive Extension)이 Rxjava, RxSwift 등이다.


데이터를 생성하는 놈을 Generator, 그 데이터를 처리하는 것을 Consumer라고 한다.

Rx에서는 그것을 Stream으로 연결시킨 상태에서, 데이터를 생성한 놈을 Observable, 처리하는 놈을 Subscriber라고 부른다. 데이터가 흘러가는 Stream사이에 Operator를 통해 데이터를 변형할 수 있다.
image


예를 들어, getText()함수에 url을 집어넣어서 어떤 데이터를 받을 때,
image

  1.  return값으로 data가 아닌 Stream을 줘버린다.
    image
  2. Stream을  먼저 연결하고 난 뒤에, Server로 가서 데이터를 가져온다.
    image
  3. 데이터가 생기면 그때서야,  Stream을 통해서 원하는 곳으로 흘려보낸다.
    image
  4. 아래는 RxSwift의 코드다.
    4번라인에서 먼저 .create()를 통해서, 바로 Stream을 생성하여 return한다.
    8번라인에서, 이후에 데이터가 생성이 되면, onNext()를 통해 Stream에다 데이터를 씌워버린다.
    15번라인처럼 사용한다, url을 주면, .subscribe()를 통해서 언젠가 들어올 데이터를 이렇게 사용하겠다 !
    image

  5. 이미지를 다운받는다고 가정해보자.
    getImageUrl()은 서버에서 이미지url을 받아서 전달해줄, Stream을 return하는 React한 함수다.
    requestDownload()은 서버에서 이미지url을 받아서 전달해줄, Stream을 return하는 React한 함수다.

    getImageUrl().을 통해서 returm되는 Stream으로 String형태의 url을 전달받는다.
    .flatmap()을 통해  전달받은 String url -> URL로 변형 -> requestDownload()에 넣어 이미지를 Stream을 통해서 전달받는다.
    image
    async하게 작동하지만, 코드상으로는 시간적으로 작성할 수 있다.

  6. 정리
    image




image

  1. 안녕하세요 2021.11.29 11:04

    자바로 oop 김밥을 만들어보자 이 내용 유튜브 주소 알 수 있을까요??

+ Recent posts