C에서 변수 인수 사용하기

안녕하세요, 야심 찬 프로그래머 여러분! 오늘 우리는 C에서 변수 인수(variable arguments)의 세계로 흥미진진한 여정을 떠납니다. 여러분의 친절한 이웃 컴퓨터 과학 교사로서, 저는 이 개념을 단계별로 안내해드리겠습니다. 그러니 마음에 드는 음료를 한 잔 가져와, 편안하게 앉아 함께 공부해봅시다!

C - Variable Arguments

변수 인수는 무엇인가요?

자, 구체적인 내용에 들어가기 전에 변수 인수가 무엇인지 이해해보겠습니다. 여러분이 파티를 계획하고, 몇 명의 친구들이 올지 모르는 상황을 상상해보세요. 어떤 수의 손님들이 오는 데 대비하고 싶을 텐데, 맞나요? 프로그래밍에서 변수 인수가 하는 일도 exactly 그와 같습니다 - 함수가 다양한 수의 인수를 받을 수 있도록 합니다.

C에서는 어떤 수의 인수를 받을 수 있는 함수를 만들 수 있습니다. 이는 몇 개의 매개변수를 함수에 전달해야 할지 모를 때 매우 유용합니다. 프로그래밍 도구kast의 스위스 아ーノ이Knife 같은东西을 가지고 있는 것과 같습니다!

변수 인수 사용법

C에서 변수 인수를 사용하려면 <stdarg.h> 헤더 파일을 포함해야 합니다. 이 파일은 변수 인수를 처리하기 위해 필요한 매크로와 형식을 포함하고 있습니다. 다음과 같은 과정을 따릅시다:

  1. 헤더 파일을 포함합니다:

    #include <stdarg.h>
  2. 변수 인수를 가지는 함수를 선언합니다:

    void myFunction(int fixedArg, ...);

    ellipsis (...)는 이 함수가 어떤 수의 추가 인수를 받을 수 있음을 컴파일러에게 알립니다.

  3. 함수 내부에서 va_list 형식의 변수를 선언합니다:

    va_list args;
  4. va_start를 사용하여 va_list를 초기화합니다:

    va_start(args, fixedArg);

    여기서 fixedArg은 ellipsis 바로 전의 마지막 명시된 매개변수입니다.

  5. va_arg를 사용하여 인수에 접근합니다:

    int value = va_arg(args, int);
  6. 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;
}

이를 해부해보면 다음과 같습니다:

  1. 우리는 <stdarg.h>를 포함하여 변수 인수를 사용할 수 있습니다.
  2. sum_numbers 함수는 합을 계산할 수 있는 수의 개수를 알기 위해 count 매개변수를 받고, 그 뒤에 ellipsis를 사용합니다.
  3. 함수 내부에서 va_list 타입의 args 변수를 선언합니다.
  4. argsva_start를 사용하여 초기화합니다.
  5. count 회 반복하면서 va_arg를 사용하여 각 인수를 더합니다.
  6. 끝나면 va_end를 사용하여 정리합니다.
  7. 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;
}

이 예제는 더 복잡하지만, 변수 인수의 강력함을 보여줍니다:

  1. my_printf 함수는 포맷 문자열과 추가 인수를 받습니다.
  2. 우리는 포맷 문자열의 각 문자를 순회합니다.
  3. '%'를 만나면 다음 문자를 확인하여 인수의 유형을 결정합니다.
  4. va_arg를 사용하여 적절한 유형의 다음 인수를 가져와 인쇄합니다.
  5. 다른 문자의 경우에는 그대로 인쇄합니다.

이 프로그램을 실행하면 다음과 같은 결과를 보게 됩니다:

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