이 글에서는 C++ STL의 모듈러스(modulus) 함수가 어떻게 동작하는지, 그 문법은 어떻게 되어 있는지, 그리고 실제 예제를 통해 어떻게 활용할 수 있는지 자세히 알아보겠습니다.
C++의 모듈러스 함수란 무엇인가?
모듈러스 함수는 C++의 <functional> 헤더 파일에 정의되어 있는 함수 객체(function object) 클래스입니다. 두 개의 인자에 대해 나머지 연산을 수행한 결과를 반환하는 이항 함수 객체(binary function object)로, 산술 연산자 '%'와 정확히 같은 방식으로 동작합니다.
모듈러스 함수의 문법
template<class T>
struct modulus : binary_function<T, T, T> {
T operator()(const T& a, const T& b) const {
return a % b;
}
};
템플릿 매개변수
이 함수 객체는 다음과 같은 매개변수를 받습니다.
T − 함수 호출 시 전달되는 인자의 데이터 타입입니다. int, long 등 나머지 연산이 가능한 산술 타입을 사용할 수 있습니다.
사용 예제
다음 예제는 transform 알고리즘과 함께 모듈러스 함수를 사용하여 배열의 각 요소가 짝수인지 홀수인지 판별하는 프로그램입니다.
#include <iostream>
#include <algorithm>
#include <functional>
using namespace std;
int main() {
// 배열 생성
int arr[] = { 10, 20, 35, 45, 50, 61 };
int rem[6];
// 각 요소를 2로 나눈 나머지를 rem 배열에 저장
transform(arr, arr + 6, rem, bind2nd(modulus<int>(), 2));
// 결과 출력
for (int i = 0; i < 6; i++) {
cout << arr[i] << " : "
<< (rem[i] == 0 ? "짝수" : "홀수") << "\n";
}
return 0;
}
실행 결과
위 코드를 실행하면 다음과 같은 출력이 생성됩니다.
10 : 짝수 20 : 짝수 35 : 홀수 45 : 홀수 50 : 짝수 61 : 홀수
참고: 최신 C++에서의 대안
예제에 사용된 std::bind2nd는 C++11에서 폐기(deprecated)되었으며, C++17부터는 표준에서 완전히 제거되었습니다. 따라서 최신 컴파일러 환경에서는 람다(lambda) 표현식을 사용하는 것이 좋습니다.
transform(arr, arr + 6, rem, [](int x) { return x % 2; });
람다 표현식을 사용하면 추가적인 바인딩 없이도 더 간결하고 직관적으로 동일한 기능을 구현할 수 있습니다. 참고로 std::modulus 자체는 여전히 표준 라이브러리에 포함되어 있으며, C++14부터는 인자 없이 특수화된 std::modulus<void>(투명 함수 객체)를 통해 서로 다른 타입의 인자도 유연하게 처리할 수 있습니다.