And Brain said,
함수적인, 너무나 함수적인 - 0. 함수형 프로그래밍 본문
Index
0. 함수형 프로그래밍
1. 람다 대수 (Lambda Calculus)와 합성함수
2. 범주론 (Category Theory)
3. 모노이드 (Monoide)
4. 펑터 (Functor)와 엔도펑터(Endo Functor)
5. 모나드 (Monad)
6 함수형 프로그래밍의 고급 기법
서문
현대 프로그래밍 패러다임은 다양한 접근 방식과 스타일을 포함하고 있습니다. 함수형 프로그래밍은 그 중 하나로, 선언형 프로그래밍의 일종이며 수학적 함수의 개념을 기반으로 합니다. 이 방식은 복잡한 문제를 보다 간결하게 표현하고, 이해하기 쉬운 코드로 구성하는 데 도움이 됩니다. 또한 동시성과 병렬 처리를 쉽게 구현할 수 있는 장점을 가지고 있습니다.
앞으로, 여러분들은 저와 함께 함수형 프로그래밍의 기본 개념부터 심화적인 내용까지 같이 살펴볼 것입니다. 람다 대수와 범주론, 고차 함수와 커링, 참조 투명성 등의 개념을 살펴본 후, 펑터, 모노이드, 모나드 같은 고급 개념에 대해서도 알아볼 것입니다. 또한 함수형 프로그래밍에서의 고급 기법들을 간단히 소개할 것입니다.
앞으로의 글은 함수적인 시각을 넓혀주기 위한 글이될 것이지만, 수학적으로 너무 깊게 빠지지는 않을 것입니다. 그러면 함수적인, 너무나 함수적인 프로그래밍을 시작해봅시다.
함수
프로그래머라면 함수가 무엇인지 모를리 없다 생각할 것입니다. 먼저, 프로그래머들에게 함수란 무엇일까요?
프로그래밍에서의 함수(function)란 하나의 특별한 목적의 작업을 수행하기 위해 독립적으로 설계된 프로그램 코드의 집합으로 대부분 알고 있을 것입니다. 함수에 관하여 이정도까지만 생각하셨다면 여러분들은 함수의 절반만 알고 계신겁니다. 정확히 따지면, 수학적 함수의 정의를 생각하지 않고 있습니다. 이제, 여러분들은 함수형 프로그래밍을 위해 한 단계 더 나아가야합니다.
수학적 함수 f는 집합 X의 각 원소에 대해 집합 Y의 원소와 정확히 하나씩 대응시키는 규칙입니다. 이때 집합 A를 함수 f의 정의역(domain)이라고 하고, 집합 B를 함수 f의 공역(codomain)이라고 합니다. 그리고 f가 x를 y에 대응시킬 때, 함수의 값을 표기하는 방법으로 f(x) = y라고 씁니다.
예를 들어, 함수 f(x) = 2x + 3은 수학적 함수입니다. 이 함수는 입력값 x에 대해 2x + 3이라는 규칙을 적용하여 출력값을 생성합니다. 따라서 주어진 입력값 x에 대해 항상 동일한 출력값이 나오게 됩니다.
요약하면, 수학적 함수는 입력값과 출력값 사이의 일정한 규칙을 나타내며, 주어진 입력값에 대해 항상 동일한 출력값을 생성합니다. 이를 함수의 순수성, 혹은 순수함수라고 부릅니다. 이는 곧 사이드이펙트(Side Effects)가 없다고 할 수 있습니다.
프로그래밍에서의 함수는 일련의 코드로 구성되어 있으며, 특정 작업을 수행하기 위해 설계되었습니다. 함수형 프로그래밍에서는 이 두 가지 개념이 결합되어, 프로그램 코드와 수학적 함수의 특성을 모두 가지게 됩니다.
패러다임
이제 본격적으로 함수형 프로그래밍의 세계에 뛰어들기 위해 먼저, 패러다임의 정의부터 알아봅시다.
한 시대의 사람들의 견해나 사고를 근본적으로 규정하고 있는 인식의 체계. 또는, 사물에 대한 이론적인 틀이나 체계.
이것이 패러다임의 사전적 정의입니다. 이를 바탕으로 하면 프로그래밍적 패러다임이란, 프로그래밍의 근본적인 인식 체계를 뜻합니다.
즉, 어떤 프로그래머가 프로그래밍을 하는 근본적인 인식이자, 방식입니다. 우리는 이런 패러다임 중에 명령형 패러다임(imperative paradigm)과 선언형 패러다임(declarative paradigm) 두 가지를 살펴보도록 합시다.
명령형 패러다임은 컴퓨터에게 어떻게 수행해야 하는지를 명시하는 것입니다. 즉, 코드가 단계적으로 실행되는 방식으로, 코드에서 명령문의 순서가 중요하며, 상태(state)를 변경하면서 프로그램이 실행됩니다.
반면 선언형 패러다임은 어떻게 수행할지를 명시하는 것이 아니라, 무엇을 수행해야 하는지를 명시하는 것입니다. 즉, 코드는 수행되어야 하는 결과를 설명하는 방식입니다. 함수형 프로그래밍에서는 함수를 사용하여 작업을 수행하고, 상태가 변경되는 대신 새로운 상태가 반환됩니다.
이제 코드를 통해 살펴보면,
// 명령형 프로그래밍
const arr = [1, 2, 3, 4, 5];
const result = [];
for (let i = 0; i < arr.length; i++) {
if (arr[i] % 2 === 1) {
result.push(arr[i]);
}
}
console.log(result); // [1, 3, 5]
// 선언형 프로그래밍
const arr = [1, 2, 3, 4, 5];
const result = arr.filter(num => num % 2 === 1);
console.log(result); // [1, 3, 5]
코드를 통해 보니 그 차이가 좀 더 명확해보이실겁니다. 두 코드 모두 배열에서 홀수만 걸러내는 같은 동작을 하지만, 인식의 차이가 코드의 차이를 만들어냈습니다. 함수형 프로그래밍은 선언형 패러다임을 따르고 있습니다.
함수형 프로그래밍
명령형 패러다임에서 함수는 일련의 명령들을 수행하기 위함일 뿐입니다. 이 함수는 전역 변수나 외부 상태에 의존할 수 있으며, 이를 변경하는 사이드 이펙트를 가질 수 있습니다. 하지만, 선언형 패러다임에서 함수는 수학적 함수의 정의에 가까워집니다.
함수형 프로그래밍은 이런 선언형 패러다임의 한 형태로, 순수함수를 지향하여, 상태를 변경하지 않고, 상태를 전달받아 새로운 상태를 생성하여 반환하는 것을 목표로 합니다.
함수형 프로그래밍의 외부 상태에 영향을 받지 않고, 외부 상태를 변경하지 않는 이러한 특성(이를 참조 투명성이라 부른다.) 덕분에, 코드의 가독성과 복잡성이 개선되며 디버깅이 쉬워집니다.
마지막으로 정리해보면, 함수형 프로그래밍은 선언형 패러다임의 한 형태로, 순수함수를 지향하여 상태 변경 없이 주어진 입력에 대해 항상 동일한 출력을 반환하도록 합니다. 오늘은 함수형 프로그래밍 세계로의 초입이니, 가볍게 여기까지만 하고 다음은 람다 계산법 (Lambda Calculus)으로 넘어가보도록 합시다.
Thanks for watching, Have a nice day.
References
https://kpug.github.io/fp-gitbook/Chapter1.html
https://teamdable.github.io/techblog/Moand-and-Functional-Architecture
'IT > 함수적인, 너무나 함수적인' 카테고리의 다른 글
함수적인, 너무나 함수적인 - 5. 모나드(Monad) (4) | 2023.05.01 |
---|---|
함수적인, 너무나 함수적인 - 4. 펑터 (Functor)와 엔도펑터(Endo Functor) (4) | 2023.04.22 |
함수적인, 너무나 함수적인 - 3. 모노이드(Monoid) (0) | 2023.04.17 |
함수적인, 너무나 함수적인 - 2. 범주론 (Category Theory) (0) | 2023.04.16 |
함수적인, 너무나 함수적인 - 1. 람다 대수 (Lambda Calculus)와 합성 함수 (0) | 2023.04.16 |