Application/기초

[기초] C++ 가변 파라미터

devsalix 2024. 4. 27. 07:11
728x90

 

가변 파라미터는 함수가 정해지지 않은 수의 인자를 받을 수 있도록 해주는 기능입니다.

C++에서는 주로 두 가지 방법을 사용하여 가변 파라미터를 구현할 수 있습니다.

  • C 스타일의 'stdarg.h' 헤더를 사용하는 방법
  • C++11 이후에 도입된 'initializer_list'와 가변 템플릿을 활용하는 방법

이 글에서는 이 두 방법을 소개하고 각각의 장단점을 비교해 보겠습니다.

 


 

C 스타일 가변 파라미터 ('stdarg.h')

 

가변 파라미터를 처리하는 전통적인 C 방식은 'stdarg.h' 헤더 파일을 포함하여

'va_list', 'va_start', 'va_arg', 'va_end' 매크로를 사용하는 것입니다.

이 방법은 C와의 호환성이 필요한 경우나 매우 낮은 수준에서의 컨트롤이 필요할 때 유용합니다.

 

예제 코드

 

#include <iostream>
#include <cstdarg>

void printNumbers(int count, ...) {
    va_list args;
    va_start(args, count);
    for (int i = 0; i < count; ++i) {
        int num = va_arg(args, int);
        std::cout << num << " ";
    }
    va_end(args);
    std::cout << std::endl;
}

int main() {
    printNumbers(5, 1, 2, 3, 4, 5);
    return 0;
}

 

#include <iostream>
#include <cstdarg>
#include <cstring>

void printStrings(int count, ...) {
    va_list args;
    va_start(args, count);

    for (int i = 0; i < count; ++i) {
        const char* str = va_arg(args, const char*);
        std::cout << str;
    }

    va_end(args);
    std::cout << std::endl;
}

int main() {
    printStrings(5, "Hello", ", ", "world", "! ", "This is C-style programming.");
    return 0;
}

 

  •  장점
    • C와의 호환성 유지
    • 모든 타입의 데이터를 처리할 수 있음
  • 단점
    • 타입 안전성이 보장되지 않음
    • 사용하기 복잡하고 오류가 발생하기 쉬움

 

C++11 가변 템플릿 ('initializer_list'와 템플릿)

 

C++11에서는 가변 매개변수 템플릿을 도입하여 타입 안전성과 사용의 편리성을 크게 개선했습니다.

'initializer_list'를 사용하거나 템플릿 가변 인자를 활용하여 함수를 정의할 수 있습니다.

 

예제 코드 ('initializer_list' 사용)

 

#include <iostream>
#include <initializer_list>

void printNumbers(std::initializer_list<int> ilist) {
    for (auto num : ilist) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
}

int main() {
    printNumbers({1, 2, 3, 4, 5});
    return 0;
}

 

예제 코드 (가변 템플릿 사용)

 

#include <iostream>

template<typename... Args>
void printNumbers(Args... args) {
    (std::cout << ... << args) << std::endl;
}

int main() {
    printNumbers(1, 2, 3, 4, 5);
    return 0;
}

 

  • 장점
    • 타입 안전성 보장
    • 사용이 간편하고 읽기 쉬움
    • 다양한 타입의 인자를 한 번에 처리할 수 있음
  • 단점
    • 오직 C++11 이상에서만 사용 가능
    • 특정 상황에서 컴파일러에 따라 성능 차이가 발생할 수 있음

마무리

 

C++에서 가변 매개변수를 사용하는 방법은 상황과 요구 사항에 따라 다르게 선택할 수 있습니다.

'stdarg.h'는 레거시 코드와의 호환성이나 특정 저수준 작업에 적합할 수 있지만,

C++11 이상의 가변 템플릿은 보다 안전하고 현대적인 접근 방식을 제공합니다.

프로젝트의 요구 사항과 팀의 선호도에 따라 적절한 방법을 선택하시기 바랍니다.

 

 


제 글이 도움이 되셨다면 댓글 & 공감 부탁드려요 😀

 

 
728x90
반응형