icon안동민 개발노트

기본 매개변수


기본 매개변수 개요

 기본 매개변수는 함수 선언 시 매개변수에 기본값을 지정하는 C++의 기능입니다.

 이를 통해 함수 호출 시 일부 인자를 생략할 수 있어, 함수 사용의 유연성을 높일 수 있습니다.

기본 매개변수의 기본 문법

 기본 매개변수는 함수 선언 시 다음과 같이 지정합니다.

#include <iostream>
#include <string>
 
void printMessage(std::string message, int times = 1) {
    for (int i = 0; i < times; ++i) {
        std::cout << message << std::endl;
    }
}
 
int main() {
    printMessage("Hello");        // "Hello" 한 번 출력
    printMessage("Hello", 3);     // "Hello" 세 번 출력
    return 0;
}

 이 예제에서 times 매개변수의 기본값은 1로 설정되어 있습니다.

기본 매개변수 사용 시 주의사항

  1. 기본값은 오른쪽부터 지정해야 합니다.
// 올바른 사용
void func(int a, int b = 0, int c = 0);
 
// 잘못된 사용
void func(int a = 0, int b, int c = 0);  // 컴파일 오류
  1. 함수 선언과 정의에서 한 번만 지정해야 합니다. (보통 선언에서 지정)
// 헤더 파일
void func(int a, int b = 0);
 
// 소스 파일
void func(int a, int b /* = 0 */) {
    // 함수 구현
}
  1. 재정의된 함수에서 기본 매개변수 변경 시 주의가 필요합니다.
class Base {
public:
    virtual void func(int a = 10) { std::cout << "Base: " << a << std::endl; }
};
 
class Derived : public Base {
public:
    void func(int a = 20) override { std::cout << "Derived: " << a << std::endl; }
};
 
int main() {
    Base* ptr = new Derived();
    ptr->func();  // "Derived: 10" 출력 - 기본값은 Base 클래스의 것을 사용
    delete ptr;
    return 0;
}

기본 매개변수와 함수 오버로딩

 기본 매개변수는 함수 오버로딩과 함께 사용할 때 주의가 필요합니다.

void print(int a);
void print(int a, int b = 0);  // 잠재적 모호성
 
int main() {
    print(10);  // 어떤 함수가 호출될까요? 컴파일 오류!
    return 0;
}

기본 매개변수와 템플릿

 템플릿에서도 기본 매개변수를 사용할 수 있습니다.

template <typename T = int>
void printValue(T value) {
    std::cout << value << std::endl;
}
 
int main() {
    printValue(5);       // int 버전 사용
    printValue(3.14);    // double 버전 사용
    printValue<float>(2.5f);  // 명시적으로 float 버전 사용
    return 0;
}

객체 지향 프로그래밍에서의 기본 매개변수

 생성자에서 기본 매개변수를 사용하면 객체 생성을 더 유연하게 할 수 있습니다.

class Rectangle {
public:
    Rectangle(int width = 1, int height = 1) : width_(width), height_(height) {}
    int area() const { return width_ * height_; }
private:
    int width_, height_;
};
 
int main() {
    Rectangle r1;          // 1x1 직사각형
    Rectangle r2(5);       // 5x1 직사각형
    Rectangle r3(3, 4);    // 3x4 직사각형
    return 0;
}

기본 매개변수의 평가 시점

 기본 매개변수는 함수 호출 시점에 평가됩니다.

#include <iostream>
#include <ctime>
 
std::string getCurrentTime() {
    time_t now = time(0);
    return ctime(&now);
}
 
void logMessage(const std::string& message, std::string timestamp = getCurrentTime()) {
    std::cout << timestamp << ": " << message << std::endl;
}
 
int main() {
    logMessage("First message");
    std::this_thread::sleep_for(std::chrono::seconds(2));
    logMessage("Second message");
    return 0;
}

 이 예제에서는 각 로그 메시지마다 현재 시간이 기록됩니다.

연습 문제

  1. 다양한 도형(원, 사각형, 삼각형)의 면적을 계산하는 함수를 기본 매개변수를 사용하여 구현하세요.
  2. 기본 매개변수를 이용한 간단한 로깅 시스템을 만드세요. 로그 레벨과 출력 대상을 기본 매개변수로 설정할 수 있어야 합니다.
  3. 다음 코드의 출력 결과를 예측해보고, 실제로 실행하여 확인해보세요. 결과가 예상과 다르다면 그 이유를 설명해보세요.
class Base {
public:
    virtual void show(int x = 10) { std::cout << "Base: " << x << std::endl; }
};
 
class Derived : public Base {
public:
    void show(int x = 20) override { std::cout << "Derived: " << x << std::endl; }
};
 
int main() {
    Base* b = new Derived();
    b->show();
    delete b;
    return 0;
}

 참고자료

  • C++ 공식 문서의 기본 인자 섹션 : Default arguments
  • "Effective C++" by Scott Meyers (항목 38 : "타입이 중요한 부분"을 결정하는 데 있어 매개변수화 타입에 의존하지 마라)
  • "C++ Templates : The Complete Guide" by David Vandevoorde, Nicolai M. Josuttis, and Douglas Gregor (Chapter 10 : 함수 템플릿)
  • C++ Core Guidelines의 함수 관련 규칙 : F : Functions