Devlog.
Published on

함수형 프로그래밍 정리

cover
date
Aug 19, 2022
slug
함수형-프로그래밍-정리
status
Published
tags
Functional Programming
JavaScript
summary
함수형 프로그래밍과 자바스크립트
type
Post

함수

작업을 수행하거나 값을 계산하는 문장 집합

함수형 프로그래밍

  • 자료 처리를 조건식, 재귀를 사용하는 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임
  • 람다 대수(lambda calculus)를 근간으로 두고 있다.
  • 제어흐름(if, switch, for)을 함수로 처리하는 것이 목표

1급 객체 (= 1등 시민, First-class citizen)

다음 조건을 만족하면 1급 객체라고 한다.
  1. 변수나 데이터 구조에 할당할 수 있음
  1. 인자로 넘길 수 있음
  1. 리턴 값으로 사용할 수 있음
함수형 프로그래밍에서는 함수도 1급 객체이다.
  1. 함수를 타입으로 지정할 수 있음
  1. 함수를 인자로 넘길 수 있음
  1. 함수를 리턴 값으로 받을 수 있음

순수 함수 (Pure function)

  • 동일한 입력에 대해 항상 같은 값을 반환하는 함수
  • 함수 내부에서 인자로 받은 값을 변경하거나 프로그램 상태를 변경하는 등의 side effect가 없는 함수
    • = 참조 투명성 (referential transparency)
function f(x) { return 2 * x + 1; } // y = 2x+1

익명 함수 (Anonymous function)

  • 이름이 없는 함수
// 익명 함수를 변수에 저장 const func = function (param) { /* do something */ }; // 변수를 통해 함수 호출 func(something);
  • 일반 함수와 다르게 호이스팅이 적용되지 않는 단점이 있다.
    • 호이스팅: 함수 선언 보다 함수 호출이 윗 줄에 위치해도 실행되는 기능
// 익명 함수 호출: 오류 발생 func(); // 익명 함수 저장 const func = function () { /* do something */ };

클로저 (Closure)

  • 람대 대수(= 람다 계산식, lambda calculus)의 구현체
  • 내부함수가 외부함수의 맥락(context)에 접근할 수 있음
  • 외부함수의 실행이 끝나서 외부함수가 소멸된 이후에도 내부함수가 외부함수의 변수에 접근 할 수 있음
  • 익명 함수로 작성 가능
function outter() { let title = 'Hello, World!'; return function () { console.log(title); }; } const inner = outter(); inner(); // Hello, World!

지연 평가 (= 느긋한 계산, Lazy evaluation)

  • 계산의 결과 값이 필요할 때 까지 계산을 늦추는 기법
  • 필요할 때까지 계산을 늦추어 불필요한 계산을 줄일수 있음
  • 이점
    • 불필요한 계산을 하지 않아 빠른 계산이 가능
    • 무한 자료 구조 또는 큰 범위의 자료 구조를 부담없이 사용 가능
    • 복잡한 수식에서 오류를 피할 수 있음
  • 자바스크립트의 지연 평가
    • A() && B()에서 A()의 결과가 false라면 B()는 평가하지 않음

고차 함수 (Higher-order function)

  • 함수를 인자로 받거나 함수를 리턴하는 함수
function twice(num) { return num * 2; } function twiceNum(func, num) { return func(num); } console.log(twiceNum(twice, 5)); // 10 //////////////////////////////// function Adder(a) { return function (b) { return a + b; }; } const add10 = Adder(10); console.log(add10(5)); // 15

Reference

 

Previous Article

PlanetScale 시작하기

Next Article

Git 정리