함수형 프로그래밍

컴퓨터과학·AI
한 줄 정의: 프로그램을 "상태를 바꾸는 명령의 나열"이 아니라 "입력을 받아 출력을 내놓는 함수들의 조합"으로 짜는 프로그래밍 방식입니다.

쉽게 풀면

보통의 코드는 변수에 값을 저장하고, 그 값을 이리저리 바꿔가며 프로그램을 진행시킵니다. 함수형 프로그래밍은 이런 "바꾸기"를 최대한 피하고, 대신 "같은 입력을 넣으면 항상 같은 결과가 나오는" 순수함수들을 이어 붙여 프로그램을 만듭니다. 수학에서 f(x)=x+1이라는 함수가 x를 몇 번 넣든 항상 같은 규칙으로 결과를 내놓듯이, 함수형 프로그래밍의 함수도 외부 상태를 몰래 바꾸거나(부작용, side effect) 외부 상태에 몰래 의존하지 않습니다. 그 결과 코드의 동작을 예측하기 쉽고, 여러 계산을 동시에 실행해도(병렬 처리) 서로 꼬일 위험이 줄어듭니다.

왜 중요한가

대규모 데이터 처리, 분산 시스템, 병렬 컴퓨팅이 중요해지면서 상태 변경으로 인한 오류를 줄이고 여러 계산을 안전하게 동시에 수행할 수 있는 함수형 프로그래밍의 원칙이 소프트웨어공학과 데이터과학 논문에서 자주 다뤄집니다. 또한 순수함수 기반 설계는 코드의 동작을 수학적으로 증명하거나 테스트하기 쉬워, 신뢰성이 중요한 시스템(금융, 형식검증, 컴파일러 등) 연구에서도 함수형 접근이 선호되는 경우가 많습니다.

논문에서는 이렇게 쓰입니다

"본 연구에서 제안한 데이터 처리 파이프라인은 함수형 프로그래밍 패러다임에 따라 구현되어, 각 단계가 부작용 없는 순수함수로 분리되므로 재현성과 병렬 처리 효율이 향상되었다."

이 문장은 "각 처리 단계를 상태 변경 없이 독립적인 함수로 나누어 구현했기 때문에, 같은 입력이면 언제나 같은 결과가 나오고 여러 단계를 동시에 처리하기도 쉬웠다"는 뜻입니다.

"분산 스트림 처리 시스템의 각 연산자를 순수함수로 정의함으로써, 장애 발생 시 동일한 입력에 대해 연산을 재실행해도 일관된 결과를 보장하도록 설계하였다."

분산시스템 분야에서, 부작용이 없는 함수형 설계 덕분에 오류가 나서 계산을 다시 실행해도 항상 같은 결과가 나오는 성질(멱등성)을 확보했다는 뜻입니다.

"타입 시스템을 활용한 함수형 언어로 알고리즘을 구현함으로써 정적 분석을 통해 일부 런타임 오류를 사전에 배제할 수 있었다."

프로그래밍 언어 이론 분야에서, 함수형 언어의 엄격한 타입 시스템을 이용해 프로그램 실행 전에 특정 오류를 미리 걸러낼 수 있었다는 것을 보여주는 예시입니다.

조금 더 깊게 보면

함수형 프로그래밍을 뒷받침하는 핵심 개념으로는 값이 한 번 만들어지면 바뀌지 않는 불변성(immutability), 함수를 값처럼 다루어 다른 함수의 인자나 결과로 전달할 수 있는 고차함수(higher-order function), 그리고 데이터를 감싸며 부작용을 통제된 방식으로 다루는 모나드(monad) 같은 구조가 있습니다. 실제 산업 코드에서는 순수 함수형 언어(Haskell 등)보다, 절차형 언어에 함수형 스타일의 도구(람다식, 스트림 API 등)를 부분적으로 도입한 혼합형 접근이 더 널리 쓰이는 경향이 있습니다. 논문에서 함수형 프로그래밍을 언급할 때는 언어 전체를 함수형으로 사용했는지, 아니면 특정 설계 원칙만 부분적으로 채택했는지를 구분해서 볼 필요가 있습니다.

주의할 점

함수형 프로그래밍이 항상 절차형(명령형) 프로그래밍보다 우월한 것은 아닙니다. 대규모 상태 변경이 빈번한 작업에서는 오히려 코드가 복잡해질 수 있으며, 실제 많은 언어와 프로젝트는 함수형과 절차형 방식을 섞어 사용합니다. 또한 "함수형으로 짰다"는 말이 곧 "완전히 부작용이 없다"는 뜻은 아닐 수 있으므로, 논문에서는 어떤 부분에 어떤 원칙을 적용했는지 구체적으로 확인해야 합니다.

관련 용어