함수형 프로그래밍이란?
⚡ 스마트 요약
함수형 프로그래밍은 공유 상태와 가변 데이터를 피하고 순수 함수들을 조합하여 소프트웨어를 구축하는 방식입니다. 문장보다는 표현식을 강조하기 때문에 함수의 출력은 입력에만 의존하며, 이는 프로그램의 예측 가능성과 테스트 용이성을 높여줍니다.

함수형 프로그래밍이란?
함수형 프로그래밍(FP)은 순수 함수를 사용하여 소프트웨어를 구축하는 사고방식입니다. 객체 지향 프로그래밍에서 볼 수 있는 공유 상태와 가변 데이터 개념을 배제합니다.
함수형 언어는 명령문의 실행보다는 표현식과 선언을 강조합니다. 따라서 지역 또는 전역 상태에 의존하는 다른 프로시저와 달리, 함수형 언어에서의 값 출력은 함수에 전달된 인자에만 의존합니다.
함수형 프로그래밍의 특징
- 함수형 프로그래밍 방법은 과정이 아닌 결과에 초점을 맞춥니다.
- 핵심은 계산 대상에 있다.
- 데이터는 변경할 수 없습니다.
- 함수형 프로그래밍은 문제를 함수 단위로 분해합니다.
- 이는 조건식과 재귀를 사용하여 계산을 수행하는 수학적 함수의 개념을 기반으로 합니다.
- 반복문(루프문)이나 조건문(if-else문)과 같은 반복 기능을 지원하지 않습니다.
함수형 프로그래밍의 역사
- 함수형 프로그래밍의 기반은 람다 미적분입니다. 람다 미적분은 함수형 프로그래밍의 응용, 정의 및 재귀를 위해 1930년대에 개발되었습니다.
- LISP는 최초의 함수형 프로그래밍 언어입니다. 매카시는 1960년에 이를 설계했습니다.
- 70년대 후반, 에든버러 대학교의 연구원들은 ML(메타 언어)을 정의했습니다.
- 80년대 초, Hope 언어는 재귀 및 등식 추론을 위한 대수적 데이터 유형을 추가했습니다.
- 2004년, 함수형 프로그래밍 언어인 '스칼라'가 탄생했습니다.
함수형 프로그래밍 언어
함수형 프로그래밍 언어의 목표는 수학 함수를 모방하는 것입니다. 하지만 함수형 프로그래밍에서 기본적인 계산 과정은 수학 함수와는 다릅니다.
다음은 가장 유명한 함수형 프로그래밍 언어 몇 가지입니다.
- 하스켈
- SML
- Clojure
- 스칼라
- 얼랑
- 깨끗한
- F#
- ML/OCaml Lisp/구성표
- XSLT
- SQL
- 매스 매 티카
기본 기능 프로그래밍 용어 및 Concepts
불변 데이터
불변 데이터란 기존 데이터 구조를 수정하는 대신 새로운 데이터 구조를 쉽게 생성할 수 있어야 함을 의미합니다.
참조 투명성
함수형 프로그래밍은 마치 처음 실행하는 것처럼 모든 연산을 완벽하게 수행해야 합니다. 따라서 프로그램 실행 중에 발생할 수 있는 일과 발생하지 않을 수 있는 일, 그리고 그 부작용을 정확히 파악할 수 있어야 합니다. 함수형 프로그래밍 용어로 이를 참조 투명성(Referential transparency)이라고 합니다.
모듈성
모듈식 설계는 생산성을 향상시킵니다. 작은 모듈은 빠르게 코딩할 수 있고 재사용 가능성이 높아 프로그램 개발 속도를 확실히 높여줍니다. 또한, 모듈은 개별적으로 테스트할 수 있어 단위 테스트 및 디버깅에 소요되는 시간을 줄여줍니다.
유지 보수성
유지보수성은 함수형 프로그래밍이 유지보수하기 더 쉽다는 것을 의미하는 간단한 용어입니다. 함수형 프로그래밍에서는 주어진 함수 외부의 어떤 것도 실수로 변경할 염려가 없기 때문입니다.
일류 기능
'일급 함수'란 프로그래밍 언어에서 사용에 제한이 없는 요소를 가리키는 정의입니다. 따라서 일급 함수는 프로그램의 어느 위치에든 나타날 수 있습니다.
폐쇄
클로저는 부모 함수가 실행된 후에도 부모 함수의 변수에 접근할 수 있는 내부 함수입니다.
고차 함수
고차 함수는 다른 함수를 인수로 사용하거나 결과로 반환합니다.
고차 함수는 부분 적용 또는 커링을 허용합니다. 이 기법은 함수를 인수에 한 번에 하나씩 적용하며, 각 적용은 다음 인수를 받는 새로운 함수를 반환합니다.
순수 기능
'순수 함수'는 입력이 입력으로 선언되고 그 중 어느 것도 숨겨서는 안 되는 함수입니다. 출력도 출력으로 선언됩니다.
순수 함수는 매개변수에 대해 작동합니다. 아무것도 반환하지 않으면 효율적이지 않습니다. 또한, 주어진 매개변수에 대해 항상 동일한 출력을 제공합니다.
예:
Function Pure(a,b) { return a+b; }
불순한 함수
불순 함수는 순수 함수와 정반대입니다. 입력이나 출력이 숨겨져 있기 때문에 불순 함수라고 불립니다. 불순 함수는 의존성을 가지고 있으므로 단독으로 사용하거나 테스트할 수 없습니다.
예시
int z; function notPure(){ z = z+10; }
기능 구성
기능합성은 2개 이상의 기능을 결합하여 새로운 기능을 만드는 것입니다.
공유 상태
공유 상태는 객체 지향 프로그래밍에서 중요한 개념입니다. 기본적으로 객체에 속성을 추가하는 것을 의미합니다. 예를 들어, 하드디스크가 객체라면 저장 용량과 디스크 크기를 속성으로 추가할 수 있습니다.
부작용
부작용이란 함수 호출 외부에서 발생하는 모든 상태 변화를 말합니다. 함수형 프로그래밍 언어의 가장 큰 목표는 부작용을 소프트웨어 코드의 나머지 부분과 분리하여 최소화하는 것입니다. 함수형 프로그래밍에서는 부작용을 프로그래밍 로직의 나머지 부분과 분리하는 것이 매우 중요합니다.
함수형 프로그래밍의 장점
- 코드에서 발생하는 혼란스러운 문제와 오류를 방지할 수 있습니다.
- 단위 테스트 및 함수형 프로그래밍 디버깅을 더 쉽게 테스트하고 실행할 수 있습니다. Code.
- 병렬 처리 및 동시성.
- 핫 코드 배포 및 내결함성.
- 더 짧은 코드로 더 나은 모듈성을 제공합니다.
- 개발자의 생산성 향상.
- 중첩 함수를 지원합니다.
- Lazy Map & Lists 등과 같은 기능적 구성
- 람다 미적분학을 효과적으로 사용할 수 있도록 합니다.
함수형 프로그래밍의 한계
- 함수형 프로그래밍 패러다임은 쉽지 않기 때문에 초보자들이 이해하기 어렵습니다.
- 코딩 과정에서 많은 객체가 변경되기 때문에 유지 관리가 어렵습니다.
- 많은 모킹 작업과 광범위한 환경 설정이 필요합니다.
- 재사용은 매우 복잡하며 지속적인 리팩토링이 필요합니다.
- 사물이 문제를 정확하게 나타내지 못할 수도 있습니다.
함수형 프로그래밍과 객체 지향 프로그래밍
| 함수형 프로그래밍 | OOP |
|---|---|
| FP는 불변 데이터를 사용합니다. | OOP는 가변 데이터를 사용합니다. |
| 선언적 프로그래밍 기반 모델을 따릅니다. | 명령형 프로그래밍 모델을 따릅니다. |
| 이 프로그램의 핵심은 "프로그램에서 당신이 무엇을 하고 있는가"입니다. | 이 글은 "프로그래밍을 어떻게 하고 있는가"에 초점을 맞추고 있습니다. |
| 병렬 프로그래밍을 지원합니다. | 병렬 프로그래밍을 지원하지 않습니다. |
| 이 제품의 기능에는 부작용이 없습니다. | 어떤 시술 방법은 여러 부작용을 일으킬 수 있습니다. |
| 흐름 제어는 함수 호출 및 재귀 함수 호출을 사용하여 수행됩니다. | 흐름 제어 프로세스는 루프와 조건문을 사용하여 수행됩니다. |
| 명령문의 실행 순서는 그다지 중요하지 않습니다. | 명령문의 실행 순서가 중요합니다. |
| 복근을 지원합니다trac데이터 분석 및 요약trac행동에 대한 논쟁.” | "복근"만 지원합니다.trac데이터에 대한 논의. |

