본문 바로가기

programming/용어정리

[용어] 람다(Lambda) vs 람다식(Lambda expressions)

*사실 말장난이므로 즐기는 주제로 봐주셨으면 좋겠습니다.

 

 

 람다식은 최근 굉장히 잦은 확률로 개발에 활용이 되고 있다. 자바스크립트 (이하 JS)로 간단한 웹을 구축할때도 이를 활용한 예제가 심심치 않게 확인이 되고 있다. 최근 들어오는 수정개발 요청들을 살펴보면 C# WPF 나 MFC 프로젝트, 자바로 짜여진 GUI논문제작툴 등  심심치 않게 확인이 가능했다. 

 

 사실 혁명적이거나 새로운 역사적인 기술이거나 한 것은 아니다. 마치 AI, 머신러닝을 통해 정보분석을 하여 새로운 의사결정을 하거나 블록체인을 통해 티켓발권, 통화의 대체를 하거나 핀테크나 IoT 등 우리의 삶을 직접적으로 바꾼것은 아니라고 봐도 된다. 개발자들이 어렵게 짜던 일부 코드가 보다 간략해지고 이해하기 쉽게 직관적으로 짤 수 있어 졌을뿐, 도달할 수 없었던 결과를 람다를 통해 할 수 있게 된 것은 아니다. (람다는 컴퓨터 및 기술분야에 엄청난 영향을 줬다. )

 

 프로그래밍에서는 람다와 람다식을 모두 람다식을 지칭한다고 보면 된다.

'~ 이 부분은 람다로 구현하면 좋을것 같아요~ '

라고 누군가 한다면 그말은 람다식으로 구현할 수 있을것 같은데, 그렇게 하면 보다 직관적이고 가독성이 올라가지 않을까, 내지는 그게 더 자신이 보기 편할 것 같다는 투로 보면된다.

 


 

 그러나 엄밀히 말하자면 람다(Lambda)는 다양한 뜻을 가지고 있다.

 

https://ko.wikipedia.org/wiki/%CE%9B

 

Λ - 위키백과, 우리 모두의 백과사전

 

ko.wikipedia.org

 위키에서 볼 수 있듯, 람다는 그리스 문자로 11번째, 숫자 30을 뜻한다.

 물리학, 수학에서 다뤄지기도 하며 각 분야에서 다양한 방법으로 사용된다.

 우리가 사용하는 람다식은 명확히는 모르지만, 람다 대수에서 왔을 가능성이 크다.

 

https://ko.wikipedia.org/wiki/%EB%9E%8C%EB%8B%A4_%EB%8C%80%EC%88%98

 

람다 대수 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 컴퓨터과학 및 수리논리학에서, 람다 대수 또는 람다 계산(λ-calculus, lambda-calculus)이란 변수의 네임 바인딩과 대입의 방법을 이용하여 함수 정의, 함수 적용, 귀납적 함수 추상화를 수행하고 수학 연산을 표현하는 형식 체계이다. 람다 대수는 임의의 튜링기계를 시뮬레이션 할 수 있는 보편적인 계산 모델이다. 1930년대 알론조 처치가 수학기초론을 연구하는 과정에서 람다 대수의 형식을 제안하였다. 람다

ko.wikipedia.org

수학에서 다루는 대수중, 람다 대수는 표현방법중 하나로 볼 수 있다.

자세한 내용은 위를 참고하여 보기를 바란다.

 


 

람다식(Lambda expressions)은 람다 대수의 주요 개념들을 그대로 가져온 것으로 볼 수 있다.

람다 대수에서 함수를 표현하는 방법을 그대로 가져와 개별 인자를 직관적으로 대체하고 있다.

예를 들어보자.

var items = [1,33,12,11,3,33,121];
var sum = 0;
items.forEach(i => sum+=i); // i 는 items의 각 값이 오게 된다.

여기서 표현되는 위 내용은 람다 대수의 함수 표현식을 생각해보면 어떻게 추상화가 이루어졌나 볼 수 있다.

람다 대수에서는 아래 3가지 형태의 함수 표현을 제공한다.

[위키 내용 정리]

1. 함수가 반드시 이름을 가질 필요는 없다.

2. 함수의 입력 변수의 이름 또한 필요 없다.

3. 두 개 이상의 입력을 받는 함수는 하나의 입력을 받아 또다른 함수를 출력하는 함수로 다시 쓸 수 있다. (커링)

 

1번은 익명함수로서 위 소스의 forEach 에 들어가는 함수에 이름이 없는 것으로서 이해할 수 있다. 본래는 function 에 명칭이 있어야 할 것이다. 예를 들면,

var items = [1,33,12,11,3,33,121];
var sum = 0;
function fn_eachSum(i){
    sum += i;
}
for(var idx=0; idx<items.length; idx++){
    fn_eachSum(items[idx]);
}

이름이 정의된 함수를 콜하여 원하는 결과를 얻어내는 방식으로 사용할 수 있다.

이는 수학에서 함수 f(x) 를 정의하는것과 동일한 맥락으로 볼 수 있다.

다만 람다 대수에서는 이러한 명칭이 반드시 필요하지는 않다는 사고에서 시작한다.

어차피 여기서만 사용될 것이라면, 굳이 이름까지 주어질 필요는 없다. 다른 곳에서도 사용되더라도 특별히 유의미한 명명을 줄 수가 없거나 특정 지을 방법이 없을 때는 이름이 주어지기 어려울 수 있다. (예를 들면, 공격버튼때도 사용되는 체크이면서 방어버튼 누를때도 쓰이기도 하고 똑같은 확인을 이번에 기획이 바뀌면서 걸어다닐때도 활용하는데 당연하지만 딱히 이름을 주기에는 애매모호한 확인 작업인 경우.)

따라서 이러한 함수에 굳이 명칭이 붙을 필요는 없어진다.

 

2번은 변수가 없어지거나 생략되는 것이 아니라, 명칭이 중요하지 않은것이다. 

호출지(Caller)에서는 items[idx] 라는 변수명으로서 또는 유의미한 의미를 가질수 있다. 그러나 호출되는 입장(Callee)에서는 사실 자신의 입장에서 가장 유의미한 명칭이면 되는 것이다. 호출지에서 두번 호출한다고 하자. 호출지 100 line쯤에서는 플레이어블 캐릭터를 공격한 개체를 확인하기 위해서 적군이라는 변수를 넘겼다. 그러나 호출지 1200 line 쯤에서는 플레이어블 캐릭터에 떨어지는 빗방울을 구현하기 위해서 방울이라는 변수를 넘겼다. 호출되는 입장(Callee)에서는 두 변수가 각각 명칭이 다르다고해서 변수별로 작업을 해줄 필요는 없는 것이다. (이는 대수의 개념이기도 하다.) 받는 입장에서는 활용하는 입장에서의 명칭을 변수명으로 채택하면 된다. 다만, 후번초 인계자를 위해서 유의미한 명칭으로 작성하기를 권장하는 바이다.

또한 꼭 람다식이니까 알파벳 한글자를 쓰라는 것은 아니다. 가독성을 위해서 활용되는 익명함수에서 유의미한 명칭으로서 작성하면 후번초 인계자가 인수자(또는 퇴사자)를 괴롭히는 일은 줄어들 것이다.

 

3번은 다중 입력값 또는 인자변수를 갖는 함수를 뜻한다. 쉽게 말하면 도형이고 어렵게 말하면 커링이다.

수학시간에 졸지 않았다면 원, 타원등의 특수 도형은 평면임에도 불구하고 입력값이 두 개임을 알 수 있다.

이들은 하나의 인수가 결정되어도 해가 결정되지 않는다. 따라서 인수별로 함수를 나눌수 있지 않을까 하는 단순화 개념으로 보면 쉽다. 다중 인자변수를 갖는 함수를 인자변수별로 단일인자 함수로 쪼개어 함수열로 고치는 작업이 가능하다는 것이다. 사실 쉽게 생각할수록 굉장히 간단한 개념이고, 고등수학에서 다루는 함수간의 사칙연산으로 인해 만들어지는 새로운 합성함수(이러한 행위는 언커링)를 다중 입력값을 가질 수도 있는 함수라고 보면 쉽게 이해가 갈 수 있다.

 


결국 이러니 저러니 해도 람다표기는 물리학회장에서는 반감기로 쓰일 수도 있고 수학교육생들에게는 고윳값으로 쓰일수도 있다. 타임머신을 타고 로마로 돌아간다면 숫자 30으로 쓰일 수도 있는 것이다. 람다(대수)와 람다식은 전혀 다른 용어지만, 결국 프로그래밍에서는 함께 묶어서 람다식으로 이야기 되고 있다. 함수형 프로그래밍이 각광받는 현재, 당연히 함수라는 정의를 대수적인 표현으로써 당당하게 세운 람다(대수)가 해수면 위로 떠오르는 것은 당연한 일일지도 모르겠다.

반응형