Skip to content

Latest commit

 

History

History
136 lines (71 loc) · 5.73 KB

함수형프로그래밍.md

File metadata and controls

136 lines (71 loc) · 5.73 KB

일급객체

  1. 무명의 리터럴로 생성할 수 있다. (함수 이름 없이)
  2. 변수나 자료구조(객체, 배열 등)에 저장할 수 있다.
  3. 함수의 매개변수에 전달할 수 있다.
  4. 함수의 반환 값으로 사용할 수 있다.

프로그래밍 패러다임

  • 명령형 프로그래밍(절차지향 프로그래밍, 객체지향 프로그래밍 등...)

    : 프로그램은 명령의 수행. how to에 초점. 어떻게 구현해 낼까?

  • 선언형 프로그래밍**(함수형 프로그래밍)**

    : 프로그램은 함수의 계산이다. what에 초점. 무엇을 이어붙이면 이게 구현이 될까?

함수형 프로그래밍

🧮 자료 처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임 [함수 : 수학에서의 f(x)]

함수형 프로그래밍 언어

  • Haskell, F#, OCaml, Erlang

함수형 프로그래밍을 지원하는 언어

  • JS, Kotlin, Go, Python, Rust, Java(new), C++(new), Scala

  • 특징

    1. 순수함수(Pure function)

      함수에서 외부의 상태값을 참조하거나 변경하지않는 함수.

      동일한 인자에 대해서는 항상 같은값을 반환

      언제 선언했는지는 함수에 영향주지 않아야함

    2. 비상태(Stateless), 불변성(Immutability)

      함수의 인자로 전달된 데이터를 변경하지 않아야함

      새로운 오브젝트를 만들어 결과값으로 전달해야함

      → 함수를 호출하면 외부의 상태가 변경되거나 예상하지 못한 에러가 발생하는 등의 side effect를 방지할 수 있음

      여러 동시다발적 멀티쓰레딩 환경에서도 안정적으로 동작

      Object.freeze() ⇒ 불변성으로 만들어주는 함수

    3. if, for, switch등을 사용하지 않음(Expressions Only)

      ex) for을 쓰는 대신에 배열함수를 쓴다던지..

      Untitled

      Q. 이과 학생중 상위 3명 추려서 이름(학과) 출력하는 코드로 구현하려면?

      • 명령형 프로그래밍

        Untitled

      • 함수형 프로그래밍

        Untitled

    4. 일급함수(First-class), 고차함수(higher-order funtions)

      일급함수 : 일급객체인 함수

      Untitled

      고차함수 : 함수 자체를 인자로 전달하거나 함수에서 또 다른 함수를 리턴하는 함수

      Untitled

  • 장점

    개발자가 프로그램을 읽기 좋다. 가독성이 높다

    상태를 바꾸지 않으므로 스레드 안정성이 높다

    Lock을 쓰지않아 병목현상 없다

    코어가 많아질수록 유리하다

  • 함수형 프로그래밍은 새로운 개념일까?

    1958년에 LISP라는 최초의 함수형 프로그래밍 언어가 나옴

    • 그럼 왜 이전에는 안쓰다가 최근에 함수형 프로그래밍이 핫해짐?

      명령형 프로그래밍은 사람의 사고과정과 비슷하게 동작하기때문에 일반적으로 많이 쓰는 방식이었음

      함수형 프로그래밍은 수학의 원리와 밀접하게 연결이 되어있어 배우는데 시간이 걸림. 난해함.

      AI, IoT, Big data, blockchain 등 방대한 데이터를 빠르게 계산해서 병렬적으로 안정적으로 처리하는것의 중요성이 커짐

      다운로드.png

      functions.png

  • 함수형 프로그래밍에서 사용하는 타입들 Monad, Semigroup, Applicative, Monaid, Functor, Disjunction, ... (매우어려움)

    Untitled

    • 모나드?

      i013308301945.gif

      Untitled

      💡 비순수함수를 순수함수처럼 동작하게 만드는 함수 합성 기법

      f : state ⇒ (a, state)

      g : state ⇒ (b, state)

      이 둘을 합성하려면..? 즉, 입력값이 state, 출력값이 (b, state)인 함수가 되게 연결하고 싶으면..?

      (a, state)에서 a는 g와 결합하여 g’를 생성 (모나드에 값을 래핑)

      g’ : state ⇒ (b, state)