개요
함수형 프로그래밍의 핵심적인 컨셉은 순수함수와 불변성이다.
어플리케이션 개발에서 병렬 처리와 동시성은 어플리케이션의 성능을 극대화하고 UX을 개선하는 데 필수적인 고려사항이다. 멀티 코어 프로세서의 효과적인 사용, 대용량 데이터 처리, 비동기 Non Blocking IO를 통한 빠른 응답 등의 요구사항을 만족시키기 위해 병렬 처리 및 동시성은 현대 소프트웨어 개발에서 중요한 요소가 되었다.
함수형 프로그래밍은 이러한 요구사항을 충족시키기 위한 방법론 중 하나로, 순수 함수와 불변성을 통해 병렬 처리와 동시성을 구현할 때 발생할 수 있는 상태 공유 문제를 최소화한다.
이 글에서는 병렬처리와 동시성 구현을 위한 함수형 프로그래밍의 핵심적인 컨셉에 대해 살펴 보겠다.
구체적으로
- 순수 함수
- 불변성
- 일급 객체
- 선언적 프로그래밍
순수 함수는 외부 상태에 영향을 미치지 않고 입력값에만 의존해 동일한 결과를 반환하므로, 병렬처리시 스레드 세이프하게 사용할 수 있다.
또한, 데이터 불변성은 동시성 환경에서 여러 작업이 동일한 데이터를 참조할 때 데이터 일관성을 유지하게 하여 복잡한 동기화 메커니즘을 피할 수 있게 한다.
순수함수 (Pure Functions)
순수함수
Concept
- 멱등성 : Idempotency. 기본적으로 같은 Input에 대해 항상 같은 Output을 반환하는것.
- 참조 투명성 : Referential Transparency. 참조 투명성은 표현식이 동일한 입력에 대해 항상 같은 출력을 내며, 프로그램 내에서 해당 표현식을 같은 값으로 대체해도 프로그램의 연산에 영향을 미치지 않는 성질이다. 즉 표현식 자체가 그 표현식의 결과로 대체될 수 있다.
- 순수 함수 : Pure Function. 같은 Input에 대해 항상 같은 Output을 반환하며, 외부 상태나 부작용에 의존하지 않는 함수. 외부의 어떤 상태도 변경하지 않으며, 함수의 결과가 외부 요인에 의해 영향을 받지 않는다. 모든 순수 함수는 참조 투명성을 가진다.
- Statefull : 시스템 또는 컴포넌트가 이전 호출 또는 작업의 상태를 유지하여 이후 호출에 영향을 준다. 즉, 과거의 상호작용 결과가 현재와 미래의 작업에 영향을 줄 수 있다.
- Stateless : 시스템 또는 컴포넌트에 들어오는 각 호출이 독립적으로 처리되며, 이전의 호출이나 작업에 영향을 받지 않습니다
불변성 (Immutability)
Concept
- 불변성 : 데이터 구조 또는 객체의 상태를 변경하지 않는 특성. 모든 변경 작업은 새로운 데이터 구조를 반환한다. 불변 객체는 변경 불가능하며, 어떤 연산을 통해서도 원래의 객체가 수정되지 않는다. 변경이 불가능하므로, 동시 접근 시에도 데이터의 일관성을 유지할 수 있다. 멀티 스레드 환경에서 안전하게 공유될 수 있다.
일급 객체 (First Class Object)
파이썬에서 함수가 일급 객체로 취급된다는 것은 함수를 인자처럼 다룰 수 있다는 것을 의미한다.
Concept
- first class object : 일급객체. 함수의 인자로 전달 가능하고, 함수의 리턴값으로 사용가능하며 동적으로 생성가능한 객체를 first class object라 한다. 파이썬에서 함수는 일급 객체로 취급된다.
def multiply(x, y): return x * y
# 함수를 변수에 할당
operation = multiply
# 함수를 인자로 전달
def apply_operation(func, x, y): return func(x, y)
# 함수를 반환
def get_operation(operation_type): if operation_type == "add": return lambda x, y: x + y return lambda x, y: x * yFunction Composition
합성 함수란 새로운 함수를 만들어거나 계산하기 위해 둘 이상의 함수를 조합하는 과정을 말한다. 함수형 프로그램은 여러 작은 순수 함수들로 이루어져있기 때문에 이 함수들을 연쇄적으로 또는 병렬로 호출해서 더 큰 함수를 만드는 과정으로 전체 프로그램을 구축해야 한다.
Concept
- Function Composition : 함수 합성. 어떤 결과를 계산하거나 새로운 함수를 만들기 위해 두 개 이상의 함수를 조합하는 것. 기본적으로 여러 개의 순수함수들을 병렬 또는 연쇄적으로 호출해서 더 큰 함수를 만드는 과정을 말한다.
Wrap Up
함수형 프로그래밍을 고려하는 상황
불변성 유지 및 상태관리, 병렬 처리 및 멀티스레딩, 데이터 변환, 코드 재사용, 테스트 용이성 등의 이유로 함수형 프로그래밍을 사용할 수 있다.
-
불변성 유지 및 상태 관리: 코드에서 상태 변화가 잦거나 복잡한 경우 함수형 프로그래밍은 불변 데이터 구조를 활용해 부작용을 최소화하고 예측 가능한 코드 흐름을 유지할 수 있다.
-
병렬 처리 및 멀티스레딩: 순수 함수는 부작용이 없기 때문에 병렬 처리나 멀티스레드 환경에서 안전하게 사용할 수 있습니다. 이를 통해 동시성 문제를 줄이고 효율적인 병렬 계산이 가능하다.
이 외에 데이터 변환,코드 재사용, 테스트 용이성 등의 이유로 함수형 프로그래밍을 사용할 수 있다.