함수형 프로그래밍이라는 용어의 개념이 단순하게 정의될 수 있는 성격의 것은 아닙니다. 여기서는 최대한 프로그래밍 기초 지식이 있는 사람들이 쉽게 이해할 수 있는(제가 이해하는) 수준으로 정의를 정리해 보겠습니다. 몇 가지 함수형 프로그래밍이 구성되는 개념적인 정의 요건을 확인해 볼까요?
- 함수의 조합으로 작업을 수행한다.
- 작업에 필요한 데이터와 상태 값은 변하지 않는다.
- 변할 수 있는 것은 오직 함수이다.
- 함수형 프로그래밍의 연산 대상은 이 '함수'이다.
위의 조건들이 텍스트로는 잘 이해가 가지 않을 것입니다. 우선, 한가지 예시를 들어 함수형 프로그래밍의 구조를 설명해 보도록 하겠습니다. 우선, 아래와 같은 구조의 코드를 작성한다고 가정해 봅시다.
- get_encrypted(func) 라는 함수는, 특정 함수를 인자로 받는다. 이 함수는 특정 String 변수를 암호화하여 리턴하는 것을 목적으로 하는 함수이다.
- 이 때, 암호화 대상인 String 변수는 original_value = 'test'라고 정해져 있다고 가정한다.
- get_encrypted(func)에서 인자로 받는 func 함수가 실제로 original_value를 암호화하는 작업을 진행하는 함수다.
- func에 인자로 전달될 함수는 func1, func2, func3 세 가지 방식의 함수가 선언되어 있다. 이 func1, func2, func3이 "실제로 String 변수 original_value를 암호화하는 작업"을 수행하는 함수이다.
이제 이 구조를 한 번 도식화 해보도록 하겠습니다.
위의 구조를 살펴봅시다. get_encrypted(func) 함수를 실행하면, 결과적으로 "test"라는 스트링을 암호화시키는 함수가 만들어져, 해당 결과를 출력(리턴)하게 됩니다. 그럼, 이 구조에서 [변화가 있는] 부분은 어떤 부분일까요? 간단하게도 인자로 들어오는 func입니다. 여기에 func1을 넣을지, func2를 넣을지, func3를 넣을지만을 결정하게 되는 것이죠. func에 어떤 함수를 넣을지 여부에 따라, 변수인 original_value가 변화하나요? 전혀 그렇지 않습니다. 이는 흡사 결제 금액은 1만 원인데, 신용카드로 결제할지 페이코로 결제할지 네이버 페이로 결제할지를 선택하는 것과 비슷합니다. 결제 금액은 바뀌지 않으니까요.
자, 여기서 간단하게 개념 용어를 정리해 봅시다. 여기에서 정의가 가능한 함수는 두 개가 있습니다. 바로 func1, func2, func3과 get_encrypted(func) 함수 입니다. 여기서 func에 인자로 전달되는 이 func1, func2, func3을 순수 함수(pure function)라고 합니다. 이 함수 자체의 활용이 다른 데이터에 영향을 미치지 않도록 선언되어 있습니다. 비단, 이 함수의 인자로만 쓰이는 것이 아니라 다른 함수에서도 사용이 가능합니다.
get_encrypted(func)는 함수는 어떤가요? 여기서 이 함수는 값을 리턴해주는 역할을 하게 됩니다. 그럼 아래와 같은 방식으로 값을 사용할 수 있겠죠?
var result = get_encrypted(func1);
이와 같이, 함수를 또 하나의 값이나 형태의 함수로서 반환하거나 인자 형태로도 사용할 수 있는 함수를 고계 함수(higher-order function)이라고 합니다.
결과적으로 함수형 프로그래밍 구조는 모듈화를 지향하며 데이터와 상태는 유지하되 이를 제어하는 함수를 변경하고 자유롭게 조작할 수 있는 구조를 만들어내게 됩니다.
'Programming > Javascript' 카테고리의 다른 글
14. Javascript 함수형 프로그래밍(3) - 배열의 원소 계산하기 (0) | 2023.01.28 |
---|---|
14. Javascript 함수형 프로그래밍(2) - 함수형 프로그래밍 기본 (0) | 2023.01.18 |
13. Javascript 객체지향 프로그래밍(5) - subClass 구현하기 5 (0) | 2023.01.11 |
13. Javascript 객체지향 프로그래밍(5) - subClass 구현하기 4 (0) | 2023.01.10 |
13. Javascript 객체지향 프로그래밍(5) - subClass 구현하기 3 (0) | 2023.01.05 |