함수형 프로그래밍은 작고 독립적인 함수들을 활용하기 때문에 코드가 간결해지고 가독성이 향상 됩니다. 또한 코드가 선언적이어서 의도가 명확해지고, 루프나 조건문을 줄일 수 있습니다. 그리고 작은 함수 단위로 코드를 분배하고 조합하기 때문에 재사용성을 높이고, 각 함수는 독립적으로 테스트가 가능합니다. 마지막으로 불변성으로 인해 부작용이 적어지고 코드의 예측 가능성을 높여주므로 코드의 안정성을 높이는 데 좋습니다. 그래서 데이터 변환 작업을 할 때 고차함수와 같은 함수형 프로그래밍 요소를 사용할 수 있으면 좋고, 불변성을 강조하기 때문에 여러 쓰레드에서 안전하게 동작할 수 있어 병렬 처리가 필요한 경우 사용하면 좋습니다.
함수형 프로그래밍은 불변성을 강조하고 새로운 값을 생성하는 것이 일반적이기 때문에 메모리 사용량이 늘어날 수 있습니다. 그리고 외부 API나 상호작용처럼 가변 상태를 다뤄야 할 때에는 함수형 프로그래밍을 적용하기 어려울 수 있습니다. 마지막으로 복잡한 상태 관리나 루프, 가변 상태를 요구하는 일부 알고리즘을 사용할 때에는 함수형 프로그래밍이 성능에 영향을 줄 수 있습니다.
객체지향 프로그래밍에서는 객체의 상태를 변경하는 것이 일반적이지만 함수형 프로그래밍에서는 불변성을 강조합니다. 그래서 불변한 데이터 구조를 사용하거나 상태 변경을 제한하는 메서드를 통해 변경을 수행한다면 객체의 불변성을 유지하면서도 필요한 상태 변경을 허용할 수 있습니다. 또한 객체지향 코드에서 고차 함수를 활용하는 것도 하나의 방법이 될 수 있습니다. 마지막으로 객체지향 코드에서도 모나드를 활용해 상태를 조작하거나 예외를 처리하는 등의 작업을 추상화 할 수 있습니다.
함수형 프로그래밍이란 함수를 일급 객체로 취급하고 함수의 조합을 통해 프로그램을 구성하는 스타일을 강조하는 프로그래밍 패러타임으로 부작용을 최소화 하려는 노력과 불변성, 일급 함수, 고차 함수 등의 개념을 중요시 함
일급 함수 (First-class function) : 함수가 값처럼 취급되어 변수에 할당하거나 다른 함수에 인자로 전달하거나 함수에서 반환될 수 있는 특성
고차 함수 (Higher-order function) : 함수를 다루는 함수, 함수를 인자로 받거나 함수를 반환하는 함수 (ex: map, filter, reduce)
순수 함수 (Pure functions) : 같은 입력에 대해서는 항상 같은 출력을 반환하며, 부작용이 없는 함수를 의미. 순수 함수는 예측이 가능하고 테스트하기 쉽고, 코드의 안정성을 높여줌
불변성, 부작용 제어, 모나드 등이 추가적인 특징
불변성이란 한 번 생성된 데이터의 상태가 변경되지 않는 특성을 나타내는데 한 번 값을 할당하면 그 값이 변경되지 않고 유지되는 것을 의미한다.
이러한 불변성을 가진 데이터나 객체는 할당 후 변경되지 않고, 데이터에 변경이 필요한 경우 기존 값을 변경하는 대신 새로운 값을 생성한다.
이렇게 불변성을 가는 데이터는 부작용이 적은데 함수가 외부 상태를 변경하지 않고 입력에만 의존한다는 것을 의미하며, 이것은 코드의 안정성을 높이고 예측 가능성을 향상시킬 수 있다.
또한 여러 스레드에서 동시에 접근하더라도 데이터가 변경되지 않기 때문에 스레드 간 충돌이 발생활 확률이 적다.
모나드란 함수형 프로그래밍에서 주로 사용되는 개념으로써 값을 감싸고 그 값을 가공하거나 변형하는 방법을 제공하는 디자인 패턴
부작용을 다루거나 비동기적인 작업을 처리하기 위한 추상화
Swift에서는 옵셔널이 가장 일반적인 모나드의 예시