🤖 Computer Science
[함수형 프로그래밍] 람다와 클로저
date
Mar 30, 2023
slug
fp-closure
author
status
Public
tags
함수형 프로그래밍
클로저
lambda capturing
summary
함수형 프로그래밍을 할 때 사용되는 람다 함수와 클로저라는 개념에 대해 간단히 핵심을 조사한 내용입니다.
type
Post
thumbnail
category
🤖 Computer Science
updatedAt
Apr 1, 2023 03:41 AM
람다
람다 계산법
람다 계산법 (Lambda Calculus)는 함수를 추상화하고, 계산을 수행하는 방법을 정의하는 형식 시스템의 일종이며, 알론조 처치(Alonzo Church)가 1930년에 제안하였다.
람다 계산법에서 다루는 함수는 고계 함수이며 고계 함수는 다른 함수를 인자로 받는 함수이거나, 함수를 반환하는 함수이다.
함수를 추상화, 계산 수행방법 정의
일반적인 함수의 표현방식과 람다식을 비교해보자.
getSecond 라는 이름의 함수는 시간 h, 분 m, 초 s가 주어질 때 이 시분초에 대한 초를 구하는 함수이다.람다 대수는 함수의 계산에 집중하고, 함수를 추상화한다. 람다 대수는 함수의 이름을 생략하고, 함수의 입력 변수의 이름 또한 생략 가능하며, 두 개 이상의 입력을 받는 함수는
currying 하여 함수를 작은 단위로 분리할 수 있다.(실제로는 더 엄밀한 수학적 개념이 들어가지만 생략하였습니다…)
위 람다식은 파이썬에서 거의 유사한 형태로 표현할 수 있다.
lambda h: lambda m: lambda s: h*3600 + m*60 + s
익명 함수
익명 함수는 이름이 없는 함수를 의미한다. 보통 일반적으로 람다식을 이용해 익명 함수를 표현한다. (람다식으로 익명 함수를 정의하는 것이지 반드시 익명 함수가 람다식이라는 것은 아니다.)
클로저
- 함수 바깥에 있는 변수를 참조하는 함수 값을 의미함.
일급 객체 함수의 개념을 이용해 스코프에 묶인 변수를 바인딩하기 위한 기술임.
- 기능상으로 클로저는 함수를 저장한 레코드이며 스코프의 펙터(인수)들은 클로저가 생성될때 정의되며 스코프 내 영역이 소멸되어도 펙터에 대한 접근은 독립된 복사본인 클로저를 통해 이루어짐
- (MDN 정의) 클로저는 함수를 함수의 주변 환경 (렉시컬 스코프)와 함께 결합한 것이다. 즉 클로저를 사용하면 내부 함수에서 외부 함수의 범위에 접근이 가능하다.
일급 객체
- 일급 객체는 변수에 담을 수 있어야 한다.
- 일급 객체는 인자로 전달 가능해야 한다.
- 일급 객체를 리턴값으로 전달될 수 있어야 한다.
일급 함수
- 함수형으로 된 일급 변수를 의미한다. (일급 객체처럼 다룰 수 있는 함수)
스코프
변수나 함수가 유효한 범위. 코드 블록이나 언어의 제한에 따라 정의됨. 예를 들면 함수 스코프는 함수 내에서만 유효함.
자유 변수와 종속 변수
자유 변수는 특정 수식에서 특정 변수를 상수로 치환 가능한 변수를 의미하며 그 외에 변수는 종족 변수라고 함.
Funarg Problem (함수 전달인자 문제)
C와 같은 언어에서 자유 변수를 제한 없이 사용하기 힘들다. 예를 들어 전역변수를 함수 내에서 사용하는 경우나 힙에 할당된 변수의 주소를 가져다 사용하면 괜찮겠지만 함수 콜 내에서 함수를 정의할 때 그 함수 내에서 자유 변수를 상위 함수의 지역변수를 가져다 사용할 때 문제가 될 수 있다.
중첩된 함수의 리턴값으로 내부에서 선언된 함수를 가져다 쓸 때 함수 내부에서 사용하는 자유 변수는 스택에 할당되어 있었는데, 함수 호출이 종료되고 변수가 제거되었기 때문이다.
이런 문제를 해결하기 위해 문법적으로 발생할 수 있는 일을 막아버리거나, 클로저라는 개념을 도입하는 것이다.
클로저의 자유 변수 저장 위치
- 자바스크립트 : 렉시컬 스코프 체인 사용
- 파이썬 : 함수 객체 내
__closure__필드
- Go, Rust : 힙 영역
람다 캡쳐링 (Capturing Lambda)
람다식 내에서 자유 변수를 캡쳐하는 것을 의미한다.
자바에선 스택 영역에 할당된 변수를 캡쳐할 경우 final로 지정되어 불변성을 보증받아야 한다.