순수 함수(Pure Function)는 동일한 인자 값에 대해 항상 동일한 결과를 반환하는 함수를 말합니다. 오직 결과값만 반환할 뿐, 인자 수정, 입출력 스트림 처리, 화면 출력 생성 등과 같은 부수 효과(Side Effect)가 전혀 없다는 것이 가장 큰 특징입니다.
C++에서 대표적인 순수 함수로는 sin(), strlen(), sqrt(), max(), pow(), floor() 등이 있습니다. 이 함수들은 입력값이 같으면 언제 어디서 호출하더라도 항상 같은 출력을 보장합니다.
반면 rand(), time()처럼 호출 시점이나 내부 상태에 따라 매번 다른 값을 반환하는 함수는 비순수 함수(Impure Function)에 해당합니다.
순수 함수의 주요 특징
- 동일한 입력값에 대해 항상 동일한 출력값을 반환합니다.
- 함수 외부의 상태(전역 변수, 파일, 콘솔 등)를 변경하지 않습니다.
- 인자로 받은 값을 수정하지 않습니다.
- 예측 가능성이 높아 테스트와 디버깅이 쉽고, 병렬 프로그래밍에서도 안전하게 사용할 수 있습니다.
아래에서는 대표적인 순수 함수들의 사용 예제를 통해 실제 동작 방식을 살펴보겠습니다.
strlen() 함수
strlen() 함수는 문자열의 길이를 구하는 데 사용됩니다. 문자열이 같다면 항상 같은 길이를 반환하므로 대표적인 순수 함수입니다. 아래 프로그램으로 확인해 보겠습니다.
예제 코드
#include<iostream>
#include<string.h>
using namespace std;
int main() {
char str[] = "Rainbows are beautiful";
int count = 0;
cout<<"The string is "<< str <<endl;
cout <<"The length of the string is "<<strlen(str);
return 0;
}실행 결과
위 프로그램의 실행 결과는 다음과 같습니다.
The string is Rainbows are beautiful The length of the string is 22
문자열 "Rainbows are beautiful"은 공백을 포함해 총 22개의 문자로 구성되어 있으므로 strlen() 함수는 항상 22를 반환합니다.
sqrt() 함수
sqrt() 함수는 숫자의 제곱근을 계산하는 함수입니다. 수학적으로 제곱근은 입력값이 정해지면 결과가 유일하게 결정되므로, sqrt() 역시 완벽한 순수 함수라고 할 수 있습니다.
예제 코드
#include<iostream>
#include<cmath>
using namespace std;
int main() {
int num = 9;
cout<<"Square root of "<< num <<" is "<<sqrt(num);
return 0;
}실행 결과
위 프로그램의 실행 결과는 다음과 같습니다.
Square root of 9 is 3
9의 제곱근은 항상 3이므로, 어떤 환경에서 몇 번을 호출하더라도 동일한 결과가 출력됩니다.
정리
순수 함수는 입력과 출력의 관계가 명확하고 부수 효과가 없기 때문에 코드의 신뢰성과 유지보수성을 높여 줍니다. 함수형 프로그래밍 패러다임에서 특히 중요하게 다뤄지며, C++에서도 strlen(), sqrt()처럼 예측 가능한 표준 라이브러리 함수들을 활용하면 더 안정적인 프로그램을 작성할 수 있습니다.