함수형 프로그래밍이란? 예제가 있는 튜토리얼
함수형 프로그래밍이란?
함수형 프로그래밍(FP라고도 함)은 순수 함수를 생성하여 소프트웨어 구축을 생각하는 방식입니다. 객체 지향 프로그래밍에서 관찰되는 공유 상태, 변경 가능한 데이터 개념을 피합니다.
함수형 언어는 문장의 실행보다는 표현식과 선언을 강조합니다. 따라서 로컬 또는 전역 상태에 의존하는 다른 프로시저와 달리 FP의 값 출력은 함수에 전달된 인수에만 의존합니다.
함수형 프로그래밍의 특징
- 함수형 프로그래밍 방법은 프로세스가 아닌 결과에 중점을 둡니다.
- 무엇을 계산해야 하는지에 중점을 둡니다.
- 데이터는 변경할 수 없습니다.
- 함수형 프로그래밍 문제를 '함수'로 분해
- 조건식과 재귀를 사용하여 계산을 수행하는 수학 함수의 개념을 기반으로 구축되었습니다.
- 루프 문과 같은 반복문 및 If-Else와 같은 조건문을 지원하지 않습니다.
함수형 프로그래밍의 역사
- 함수형 프로그래밍의 기초는 람다 계산입니다. 1930년대에 함수형 응용, 정의 및 재귀를 위해 개발되었습니다.
- LISP는 최초의 함수형 프로그래밍 언어였습니다. McCarthy가 1960년에 디자인했습니다.
- 70년대 후반 에든버러 대학교 연구진은 ML(Meta Language)을 정의했습니다.
- 80년대 초반 Hope 언어는 재귀 및 방정식 추론을 위한 대수 데이터 유형을 추가합니다.
- 2004년에 함수형 언어 '스칼라'가 혁신되었습니다.
함수형 프로그래밍 언어
모든 FP 언어의 목적은 수학 함수를 모방하는 것입니다. 그러나 함수형 프로그래밍에서는 기본적인 계산 과정이 다릅니다.
다음은 가장 유명한 함수형 프로그래밍 언어입니다.
- 하스켈
- SML
- Clojure
- 스칼라
- 얼랑
- 깨끗한
- F#
- ML/OCaml Lisp/구성표
- XSLT
- SQL
- 매스 매 티카
기본 기능 프로그래밍 용어 및 Concepts
불변 데이터
불변 데이터란 이미 존재하는 데이터 구조를 수정하는 대신 데이터 구조를 쉽게 생성할 수 있어야 함을 의미합니다.
참조 투명성
함수형 프로그램은 마치 처음인 것처럼 작업을 수행해야 합니다. 따라서 프로그램 실행 중에 무슨 일이 일어났는지, 일어나지 않았는지, 그리고 부작용을 알 수 있습니다. FP 용어로는 참조 투명성이라고 합니다.
모듈성
모듈식 설계로 생산성이 향상됩니다. 작은 모듈은 빠르게 코딩할 수 있고 재사용 가능성이 높아 프로그램 개발 속도가 빨라집니다. 그 외에도 모듈을 별도로 테스트할 수 있으므로 단위 테스트 및 디버깅에 소요되는 시간을 줄이는 데 도움이 됩니다.
유지 보수성
유지 관리 가능성은 주어진 기능 이외의 항목을 실수로 변경하는 것에 대해 걱정할 필요가 없으므로 FP 프로그래밍을 유지 관리하기가 더 쉽다는 것을 의미하는 간단한 용어입니다.
일류 기능
'일류 함수'는 사용에 제한이 없는 프로그래밍 언어 개체에 대한 정의입니다. 따라서 일급 함수는 프로그램의 어느 곳에나 나타날 수 있습니다.
폐쇄
클로저는 부모 함수가 실행된 후에도 부모 함수의 변수에 액세스할 수 있는 내부 함수입니다.
고차 함수
고차 함수는 다른 함수를 인수로 사용하거나 결과로 반환합니다.
고차 함수는 부분 적용이나 커링을 허용합니다. 이 기술은 각 응용 프로그램이 다음 인수를 허용하는 새 함수를 반환하므로 한 번에 하나씩 인수에 함수를 적용합니다.
순수 기능
'순수 함수'는 입력이 입력으로 선언되고 그 중 어느 것도 숨겨서는 안 되는 함수입니다. 출력도 출력으로 선언됩니다.
순수 함수는 해당 매개변수에 따라 작동합니다. 아무것도 반환하지 않으면 효율적이지 않습니다. 또한, 주어진 매개변수에 대해 동일한 출력을 제공합니다.
예:
Function Pure(a,b) { return a+b; }
불순한 함수
Impure는 Pure의 정반대 기능을 합니다. 숨겨진 입력이나 출력이 있습니다. 그것은 불순하다고 불린다. 불순한 함수는 종속성이 있으므로 단독으로 사용하거나 테스트할 수 없습니다.
예시
int z; function notPure(){ z = z+10; }
기능 구성
기능합성은 2개 이상의 기능을 결합하여 새로운 기능을 만드는 것입니다.
공유 상태
공유 상태는 OOP 프로그래밍의 중요한 개념입니다. 기본적으로 객체에 속성을 추가하는 것입니다. 예를 들어 하드디스크가 개체인 경우 저장 용량 및 디스크 크기를 속성으로 추가할 수 있습니다.
부작용
부작용은 호출된 함수 외부에서 발생하는 모든 상태 변경입니다. FP 프로그래밍 언어의 가장 큰 목표는 부작용을 나머지 소프트웨어 코드와 분리하여 최소화하는 것입니다. FP 프로그래밍에서는 프로그래밍 논리의 나머지 부분에서 부작용을 제거하는 것이 중요합니다.
함수형 프로그래밍의 장점
- 코드에서 혼란스러운 문제와 오류를 방지할 수 있습니다.
- 단위 테스트 및 FP 코드 디버그를 더 쉽게 테스트하고 실행할 수 있습니다.
- 병렬 처리 및 동시성
- 핫 코드 배포 및 내결함성
- 더 짧은 코드로 더 나은 모듈성을 제공합니다.
- 개발자의 생산성 향상
- 중첩 함수 지원
- Lazy Map & Lists 등과 같은 기능적 구성
- 람다 미적분학을 효과적으로 사용할 수 있습니다.
함수형 프로그래밍의 한계
- 함수형 프로그래밍 패러다임은 쉽지 않기 때문에 초보자가 이해하기 어렵습니다.
- 코딩 중에 많은 개체가 진화하므로 유지 관리가 어렵습니다.
- 많은 조롱과 광범위한 환경 설정이 필요합니다.
- 재사용은 매우 복잡하며 지속적인 리팩토링이 필요합니다.
- 개체가 문제를 올바르게 표현하지 못할 수 있음
함수형 프로그래밍과 객체 지향 프로그래밍
함수형 프로그래밍 | OOP |
---|---|
FP는 불변 데이터를 사용합니다. | OOP는 가변 데이터를 사용합니다. |
선언적 프로그래밍 기반 모델을 따릅니다. | 명령형 프로그래밍 모델을 따릅니다. |
초점이 맞춰지는 것은 “당신이 하고 있는 일. 프로그램에서요.” | 초점을 맞추는 것은 "프로그래밍을 어떻게 수행하고 있는가"입니다. |
병렬 프로그래밍을 지원합니다. | 병렬 프로그래밍을 지원하지 않습니다. |
그 기능에는 부작용이 없습니다. | 방법은 많은 부작용을 일으킬 수 있습니다. |
흐름 제어는 함수 호출 및 재귀 함수 호출을 사용하여 수행됩니다. | 흐름 제어 프로세스는 루프와 조건문을 사용하여 수행됩니다. |
명령문의 실행 순서는 그다지 중요하지 않습니다. | 명령문의 실행 순서가 중요합니다. |
"데이터에 대한 추상화"와 "행동에 대한 추상화"를 모두 지원합니다. | "데이터에 대한 추상화"만 지원합니다. |
결론
- 함수형 프로그래밍 또는 FP는 몇 가지 기본 정의 원칙을 기반으로 소프트웨어 구성에 대해 생각하는 방식입니다.
- 함수형 프로그래밍 개념은 프로세스가 아닌 결과에 초점을 맞춥니다.
- 모든 FP 언어의 목적은 수학 함수를 모방하는 것입니다.
- 가장 유명한 함수형 프로그래밍 언어: 1)Haskell 2)SM 3) Clojure 4) Scala 5) Erlang 6) Clean
- '순수 함수'는 입력이 입력으로 선언되고 그 중 어느 것도 숨겨서는 안 되는 함수입니다. 출력도 출력으로 선언됩니다.
- 불변 데이터는 이미 존재하는 데이터 구조를 수정하는 대신 데이터 구조를 쉽게 생성할 수 있어야 함을 의미합니다.
- 코드에서 혼란스러운 문제와 오류를 방지할 수 있습니다.
- 함수형 코드는 쉽지 않아 초보자가 이해하기 어렵습니다.
- FP는 Immutable 데이터를 사용하고 OOP는 Mutable 데이터를 사용합니다.