함수형 프로그래밍(Functional Programming)은 백엔드/프론트엔드를 막론하고 자주 질문 받으며 실제로 현업에서도 자주 다루는 개념입니다. 함수형 프로그래밍에 대해 설명해보도록 하겠습니다.
함수형 프로그래밍이란?
함수형 프로그래밍(Functional Programming)은 프로그래밍 패러다임 중 하나로, 순수 함수와 불변성(Immutable)을 강조하며, 프로그램의 상태 변경을 최소화하는 것을 목표로 합니다. 함수형 프로그래밍은 수학적 함수의 개념에 기반을 두고 있으며, 이를 통해 코드의 간결성, 모듈성 및 예측 가능성을 높일 수 있습니다.
함수형 프로그래밍의 주요 특징
- 순수 함수(Pure functions): 순수 함수는 동일한 입력에 대해 항상 동일한 출력을 반환하며, 외부 상태에 영향을 주지 않습니다. 이로 인해 함수의 결과를 예측하기 쉬워지고, 테스트와 디버깅이 용이해집니다.
- 불변성(Immutability): 함수형 프로그래밍에서는 데이터의 상태를 변경하는 대신, 변경된 새로운 데이터를 생성합니다. 이를 통해 상태 변경으로 인한 버그 발생 가능성을 줄일 수 있습니다.
- 고차 함수(Higher-order functions): 고차 함수는 함수를 인자로 받거나 함수를 반환할 수 있는 함수입니다. 이를 통해 코드를 더 간결하게 작성할 수 있으며, 중복을 줄이고 재사용성을 높일 수 있습니다.
- 커리(Currying): 커리는 여러 개의 인자를 가진 함수를 하나의 인자를 받는 함수로 변환하는 기법입니다. 커리를 사용하면 함수를 더 유연하게 조합하고, 코드를 간결하게 작성할 수 있습니다.지연 평가(Lazy evaluation): 지연 평가는 표현식이 필요한 시점까지 계산을 미루는 기법입니다. 이를 통해 불필요한 계산을 줄이고, 성능을 향상시킬 수 있습니다.
함수형 프로그래밍은 복잡한 상태 관리와 부작용을 최소화하고, 모듈화와 재사용성을 높이는 데 도움이 됩니다. 하스켈(Haskell), 클로저(Clojure), 스칼라(Scala) 및 에릭슨(Erlang)과 같은 언어가 함수형 프로그래밍을 지원합니다. 또한 자바스크립트, 파이썬, 루비와 같은 언어에서도 함수형 프로그래밍 기법을 적용할 수 있습니다.
기존에는 어떤 문제가?
함수형 프로그래밍이 발전한 배경에는 여러 가지 기존 문제와 한계가 있습니다. 그 중 일부는 아래와 같습니다.
- 부작용과 상태 관리: 명령형 프로그래밍에서는 상태 변경과 부작용이 빈번하게 발생할 수 있습니다. 이로 인해 코드의 복잡성이 증가하고, 예측 가능성이 떨어지며, 디버깅이 어려워질 수 있습니다. 함수형 프로그래밍은 순수 함수와 불변성을 통해 상태 관리의 복잡성을 줄이고, 코드의 예측 가능성과 안정성을 높입니다.
- 모듈성과 재사용성: 명령형 프로그래밍에서는 코드의 모듈성과 재사용성이 제한적일 수 있습니다. 함수형 프로그래밍은 고차 함수와 커링을 사용해 코드의 중복을 줄이고, 모듈화 및 재사용성을 향상시킵니다.
- 병렬성과 동시성: 멀티코어 프로세서와 병렬 컴퓨팅이 일반화되면서, 병렬성과 동시성 처리가 중요해졌습니다. 명령형 프로그래밍에서 병렬성과 동시성을 처리하려면 복잡한 동기화 기법을 사용해야 합니다. 함수형 프로그래밍에서는 불변성을 통해 상태 변경을 최소화함으로써, 동시성 처리가 쉽고 안정적이게 됩니다.
- 성능 최적화: 지연 평가를 사용하는 함수형 프로그래밍은 불필요한 계산을 줄여 성능을 향상시킬 수 있습니다. 이를 통해 리소스를 효율적으로 사용하고, 계산 비용이 높은 작업을 최적화할 수 있습니다.
- 수학적 기반과 추상화: 함수형 프로그래밍은 수학적 함수에 기반을 두고 있어, 높은 수준의 추상화를 제공합니다. 이를 통해 개발자들이 문제를 더 직관적이고 일관된 방식으로 해결할 수 있습니다.
그렇다고 함수형 프로그래밍이 모든 상황에서 적합한 것은 아닙니다! 세상에 완벽한게 어딨겠어요? 단점도 명확합니다.
함수형 프로그래밍의 단점
- 학습 곡선: 함수형 프로그래밍은 명령형 프로그래밍과 상당히 다른 개념과 접근 방식을 사용합니다. 따라서 개발자들이 새로운 개념들, 예를 들어 순수 함수, 불변성, 고차 함수 등을 학습하는 데 시간이 걸릴 수 있습니다.
- 추상화 수준: 함수형 프로그래밍은 높은 수준의 추상화를 제공합니다. 이로 인해 코드가 간결하고 모듈화되긴 하지만, 때로는 이해하기 어렵고 복잡해질 수도 있습니다. 특히 함수형 프로그래밍에 익숙하지 않은 개발자들에게는 코드 해석이 어려울 수 있습니다.
- 성능: 함수형 프로그래밍에서는 불변성과 순수 함수를 사용하여 상태 변경을 최소화합니다. 그러나 이로 인해 메모리 사용량이 증가하거나, 가비지 컬렉션 비용이 높아질 수 있습니다. 또한, 재귀를 사용한 경우 스택 오버플로우가 발생할 수도 있습니다.
- 최적화 제한: 몇몇 최적화 기법들이 함수형 프로그래밍에서는 적용하기 어려울 수 있습니다. 예를 들어, 상태 변경이 없다는 가정으로 최적화를 수행하는 것은 일부 경우에 제한적일 수 있습니다.
- 표현력: 일부 애플리케이션에서는 명령형 프로그래밍이 더 직관적이고 표현력이 높을 수 있습니다. 특히 상태 변경이 빈번하게 발생하는 경우, 함수형 프로그래밍으로 표현하기 어려운 경우가 있을 수 있습니다.
반응형
'기술 이야기 > 면접 꿀팁' 카테고리의 다른 글
[면접 꿀팁] Eigenvalue와 Eigenvector 설명 (0) | 2023.04.15 |
---|---|
[면접 꿀팁] Similarity Search에 대하여 (0) | 2023.04.14 |
[면접 꿀팁] Probability와 Likelihood의 차이점 (2) | 2023.04.11 |
[면접 꿀팁] Python에서 메모리를 어떻게 관리하는가? (4) | 2023.04.02 |
[면접 꿀팁] 배열(Array)과 링크드 리스트(Linked list)의 특징 (0) | 2023.03.31 |
댓글