인자의 개수가 정해져 있지 않고, 호출할 때마다 여러 개의 인자를 받을 수 있는 함수를 만들고 싶은 경우가 있습니다. 예를 들어 sum(), max(), min() 세 가지 함수를 만들어 각각 주어진 숫자들의 합계, 최댓값, 최솟값을 계산한다고 생각해 봅시다.
이런 종류의 함수를 가변 인자 함수(variadic function)라고 부르며, 정의하려면 함수 매개변수에 줄임표(...) 세 개의 점을 사용해야 합니다. 또한 이를 사용하려면 stdarg.h 헤더 파일을 포함시켜야 합니다.
각 함수는 첫 번째 인자로 나머지 인자의 개수(count)를 받습니다. 가변 인자에 접근하기 위해 알아두어야 할 네 가지 요소는 다음과 같습니다.
- va_list : 전달된 모든 가변 인자를 저장하는 자료형입니다.
- va_start : 가변 인자 목록에 대한 접근을 시작합니다.
- va_arg : 지정한 타입의 다음 인자를 하나씩 가져옵니다.
- va_end : 가변 인자 목록에 대한 접근을 종료합니다.
호출 예시
함수를 다음과 같이 호출했다고 가정해 보겠습니다.
sum(5, 5, 2, 8, 9, 3)max(3, 5, 9, 2)min(6, 8, 5, 2, 6, 7, 9)
그러면 출력 결과는 각각 27(다섯 개 숫자의 합), 9(세 개 숫자 중 최댓값), 2(여섯 개 숫자 중 최솟값)가 됩니다.
풀이 접근 방법
이 문제를 해결하기 위해 다음 단계를 따릅니다.
- sum() 함수 정의 : 첫 번째 매개변수 cnt와 가변 인자를 받습니다.
va_list ap선언va_start(ap, cnt)로 ap 초기화- n := 0으로 초기화
- i := 0부터 i < cnt까지 반복하며 n에
va_arg(ap, int)로 가져온 값을 더함 va_end(ap)로 접근 종료 후 n 반환
- min() 함수 정의 : 마찬가지로 cnt와 가변 인자를 받습니다.
va_list ap선언 및va_start(ap, cnt)로 초기화- minimum := 99999로 초기화
- 반복문 안에서 current :=
va_arg(ap, int)로 다음 인자를 가져오고, current < minimum이면 minimum := current로 갱신 va_end(ap)로 접근 종료 후 minimum 반환
- max() 함수 정의 : 동일한 방식으로 cnt와 가변 인자를 받습니다.
va_list ap선언 및va_start(ap, cnt)로 초기화- maximum := 0으로 초기화
- 반복문 안에서 current :=
va_arg(ap, int)로 다음 인자를 가져오고, current > maximum이면 maximum := current로 갱신 va_end(ap)로 접근 종료 후 maximum 반환
예제 코드
다음 구현 예제를 통해 더 잘 이해해 보겠습니다.
#include <stdio.h>
#include <stdarg.h>
int sum (int cnt,...) {
va_list ap;
int i, n;
va_start(ap, cnt);
n = 0;
for (i=0;i<cnt;i++){
n += va_arg(ap, int);
}
va_end(ap);
return n;
}
int min(int cnt,...) {
va_list ap;
int i, current, minimum;
va_start(ap, cnt);
minimum = 99999;
for (i=0;i<cnt;i++){
current = va_arg(ap, int);
if (current < minimum)
minimum = current;
}
va_end(ap);
return minimum;
}
int max(int cnt,...) {
va_list ap;
int i, current, maximum;
va_start(ap, cnt);
maximum = 0;
for (i=0;i<cnt;i++){
current = va_arg(ap, int);
if (current > maximum)
maximum = current;
}
va_end(ap);
return maximum;
}
int main(){
printf("%d\n",sum(5, 5, 2, 8, 9, 3));
printf("%d\n",max(3, 5, 9, 2));
printf("%d\n",min(6, 8, 5, 2, 6, 7, 9));
}입력
sum(5, 5, 2, 8, 9, 3) max(3, 5, 9, 2) min(6, 8, 5, 2, 6, 7, 9)
출력
27 9 2
이처럼 C 언어에서는 stdarg.h의 매크로들을 활용하면 인자 개수가 유동적인 함수를 손쉽게 구현할 수 있습니다. 다만 가변 인자 함수는 타입 검사가 이루어지지 않으므로, 인자의 개수와 타입을 정확히 전달하는 것이 중요합니다.