C에서 변수 인수 사용하기
안녕하세요, 야심 찬 프로그래머 여러분! 오늘 우리는 C에서 변수 인수(variable arguments)의 세계로 흥미진진한 여정을 떠납니다. 여러분의 친절한 이웃 컴퓨터 과학 교사로서, 저는 이 개념을 단계별로 안내해드리겠습니다. 그러니 마음에 드는 음료를 한 잔 가져와, 편안하게 앉아 함께 공부해봅시다!
변수 인수는 무엇인가요?
자, 구체적인 내용에 들어가기 전에 변수 인수가 무엇인지 이해해보겠습니다. 여러분이 파티를 계획하고, 몇 명의 친구들이 올지 모르는 상황을 상상해보세요. 어떤 수의 손님들이 오는 데 대비하고 싶을 텐데, 맞나요? 프로그래밍에서 변수 인수가 하는 일도 exactly 그와 같습니다 - 함수가 다양한 수의 인수를 받을 수 있도록 합니다.
C에서는 어떤 수의 인수를 받을 수 있는 함수를 만들 수 있습니다. 이는 몇 개의 매개변수를 함수에 전달해야 할지 모를 때 매우 유용합니다. 프로그래밍 도구kast의 스위스 아ーノ이Knife 같은东西을 가지고 있는 것과 같습니다!
변수 인수 사용법
C에서 변수 인수를 사용하려면 <stdarg.h>
헤더 파일을 포함해야 합니다. 이 파일은 변수 인수를 처리하기 위해 필요한 매크로와 형식을 포함하고 있습니다. 다음과 같은 과정을 따릅시다:
-
헤더 파일을 포함합니다:
#include <stdarg.h>
-
변수 인수를 가지는 함수를 선언합니다:
void myFunction(int fixedArg, ...);
ellipsis (...)는 이 함수가 어떤 수의 추가 인수를 받을 수 있음을 컴파일러에게 알립니다.
-
함수 내부에서
va_list
형식의 변수를 선언합니다:va_list args;
-
va_start
를 사용하여va_list
를 초기화합니다:va_start(args, fixedArg);
여기서
fixedArg
은 ellipsis 바로 전의 마지막 명시된 매개변수입니다. -
va_arg
를 사용하여 인수에 접근합니다:int value = va_arg(args, int);
-
va_end
를 사용하여 정리합니다:va_end(args);
이제 실제 예제로 모든 것을 통합해보겠습니다!
예제: 수의 합
여러 수의 합을 계산할 수 있는 함수를 만들어보겠습니다. sum_numbers
라고 부르겠습니다.
#include <stdio.h>
#include <stdarg.h>
int sum_numbers(int count, ...) {
va_list args;
int sum = 0;
va_start(args, count);
for (int i = 0; i < count; i++) {
sum += va_arg(args, int);
}
va_end(args);
return sum;
}
int main() {
printf("Sum of 2, 4, 6: %d\n", sum_numbers(3, 2, 4, 6));
printf("Sum of 1, 3, 5, 7, 9: %d\n", sum_numbers(5, 1, 3, 5, 7, 9));
return 0;
}
이를 해부해보면 다음과 같습니다:
- 우리는
<stdarg.h>
를 포함하여 변수 인수를 사용할 수 있습니다. -
sum_numbers
함수는 합을 계산할 수 있는 수의 개수를 알기 위해count
매개변수를 받고, 그 뒤에 ellipsis를 사용합니다. - 함수 내부에서
va_list
타입의args
변수를 선언합니다. -
args
를va_start
를 사용하여 초기화합니다. -
count
회 반복하면서va_arg
를 사용하여 각 인수를 더합니다. - 끝나면
va_end
를 사용하여 정리합니다. -
main
함수에서sum_numbers
를 두 번 호출하여 다른 수의 개수로 테스트합니다.
이 프로그램을 실행하면 다음과 같은 결과를 보게 됩니다:
Sum of 2, 4, 6: 12
Sum of 1, 3, 5, 7, 9: 25
이게 멋지지 않나요? 우리는 어떤 수의 정수를 처리할 수 있는 함수를 만들었습니다!
고급 예제: 포맷된 인쇄 함수
이제 기본적인 내용을 숙지했으므로, 좀 더 고급 예제를 시도해보겠습니다. 우리는 자신만의 간소화된 printf
버전을 만들어보겠습니다. 이는 변수 인수의 강력함을 실제로 보여줄 것입니다!
#include <stdio.h>
#include <stdarg.h>
void my_printf(const char* format, ...) {
va_list args;
va_start(args, format);
while (*format != '\0') {
if (*format == '%') {
format++;
switch (*format) {
case 'd':
printf("%d", va_arg(args, int));
break;
case 'f':
printf("%f", va_arg(args, double));
break;
case 'c':
printf("%c", va_arg(args, int));
break;
case 's':
printf("%s", va_arg(args, char*));
break;
default:
putchar(*format);
}
} else {
putchar(*format);
}
format++;
}
va_end(args);
}
int main() {
my_printf("Hello, %s! You are %d years old.\n", "Alice", 25);
my_printf("Pi is approximately %f\n", 3.14159);
my_printf("The first letter of the alphabet is %c\n", 'A');
return 0;
}
이 예제는 더 복잡하지만, 변수 인수의 강력함을 보여줍니다:
-
my_printf
함수는 포맷 문자열과 추가 인수를 받습니다. - 우리는 포맷 문자열의 각 문자를 순회합니다.
- '%'를 만나면 다음 문자를 확인하여 인수의 유형을 결정합니다.
-
va_arg
를 사용하여 적절한 유형의 다음 인수를 가져와 인쇄합니다. - 다른 문자의 경우에는 그대로 인쇄합니다.
이 프로그램을 실행하면 다음과 같은 결과를 보게 됩니다:
Hello, Alice! You are 25 years old.
Pi is approximately 3.141590
The first letter of the alphabet is A
일반 변수 인수 매크로
다음은 변수 인수를 처리할 때 흔히 사용되는 매크로 표입니다:
매크로 | 설명 |
---|---|
va_list | 변수 인수 정보를 저장하는 타입 |
va_start | va_list 변수를 초기화합니다 |
va_arg | 다음 인수를 가져옵니다 |
va_end | va_list 변수를 정리합니다 |
va_copy | 하나의 va_list의 내용을 다른 va_list로 복사합니다 |
결론
이제 여러분은 C에서 변수 인수에 대한 여정을 마치게 되었습니다. 기본적인 합 계산 함수에서 자신만의 printf
와 같은 함수를 만드는 것까지, 이 기능의 유연성과 강력함을 보았습니다.
기억하시기 바랍니다, 강력한 기능은 큰 책임을 동반합니다. 변수 인수는 매우 유용하지만, 신중하게 사용하지 않으면 오류를 초래할 수 있습니다. 언제나 몇 개의 인수를 기대하고, 어떤 유형의 인수인지 알아야 합니다.
프로그래밍 여정을 계속하면서, 여러분은 많은 상황에서 변수 인수를 사용하여 코드를 더 유연하고 강력하게 만들 수 있을 것입니다. 그러므로 새로운 지식으로 실험하고 놀아보세요!
행복한 코딩을 기원하며, 컴파일러 오류는 적고 프로그램이 원활하게 실행되길 바랍니다!
Credits: Image by storyset