- Published on
함수형 프로그래밍 정리

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급 객체이다.
- 함수를 타입으로 지정할 수 있음
- 함수를 인자로 넘길 수 있음
- 함수를 리턴 값으로 받을 수 있음
순수 함수 (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