디폴트 매개변수는 C++의 강력한 기능 중 하나로, 함수 호출 시 선언된 매개변수보다 적은 인수를 전달할 수 있게 해줍니다. 인수가 제공되지 않으면, 컴파일러는 함수 선언 또는 정의에서 지정된 기본값을 사용합니다. 이 기능을 통해 함수 호출이 간소화되고 중복이 줄어들어 코드가 더 깔끔하고 유지보수하기 쉬워집니다.
이번 블로그 포스트에서는 디폴트 매개변수가 어떻게 동작하는지, 어디에 지정될 수 있는지, 그리고 몇 가지 중요한 규칙과 모범 사례를 C++ 코드 예제를 통해 자세히 알아보겠습니다.
먼저, 지수 연산을 수행하는 간단한 함수 예제를 살펴보겠습니다.
int pow0(int base, int exp = 2)
{
int result = 1;
for (int i = 0; i < exp; ++i)
{
result *= base;
}
return result;
}
pow0
함수에서 exp
매개변수는 기본값으로 2
가 설정되어 있습니다. 즉, exp
가 함수 호출 시 제공되지 않으면 2
가 기본값으로 사용됩니다.
사용 예:
cout << pow0(2, 10) << endl; // 출력: 1024 (2^10)
cout << pow0(2) << endl; // 출력: 4 (2^2, exp가 디폴트로 2를 사용)
다음 예제에서는 모든 매개변수에 디폴트 값이 설정된 함수입니다.
int pow1(int base = 2, int exp = 2)
{
return pow0(base, exp);
}
이 경우 pow1
함수는 인수가 없이도 호출할 수 있습니다.
사용 예:
cout << pow1() << endl; // 출력: 4 (2^2, base와 exp 모두 2로 디폴트)
디폴트 매개변수는 함수 프로토타입에서 지정될 수도 있습니다. 이 경우, 헤더 파일이나 소스 파일의 맨 처음에 위치하게 됩니다.
int pow2(int base, int exp);
int pow2(int, int = 2);
pow2
함수는 두 개의 매개변수로 선언되었지만, 나중에 exp
매개변수에 2
라는 디폴트 값이 지정된 프로토타입이 제공됩니다.
사용 예:
cout << pow2(2) << endl; // 출력: 4 (2^2)
pow2
함수는 하나의 인수만으로 호출되었고, 컴파일러는 exp
의 디폴트 값인 2
를 사용했습니다.
디폴트 매개변수는 원시 타입에만 국한되지 않고, 사용자 정의 타입에서도 사용할 수 있습니다.
struct Person
{
float weight;
float height;
};
Person p{ 67.f, 175.f };
void goo(Person p0 = p)
{
cout << p0.weight << endl;
cout << p0.height << endl;
}
이 예제에서 goo
함수는 Person
객체를 매개변수로 받습니다. 인수가 제공되지 않으면, 기본 Person
객체 p
를 사용합니다.
사용 예:
goo(); // 출력: 67 175 (기본 Person p 사용)
goo(Person{ 74.f, 183.f }); // 출력: 74 183 (제공된 Person 객체 사용)
포인터와 동적 메모리를 사용할 때, 디폴트 매개변수는 유효한 객체가 제공되지 않은 경우를 처리하는 데 유용할 수 있습니다.
void print(Person* p0 = nullptr)
{
if (p0)
{
cout << p0->weight << endl;
cout << p0->height << endl;
}
else
{
cout << "invalid" << endl;
}
}
print
함수에서 만약 nullptr
이 전달되거나 인수가 없이 호출되면 "invalid"를 출력합니다. 유효한 Person
객체가 제공되면, 해당 객체의 weight
와 height
를 출력합니다.
사용 예:
print(); // 출력: invalid
Person p{ 74.f, 183.f };
print(&p); // 출력: 74 183
디폴트 매개변수와 함수 오버로딩을 함께 사용할 때, 잘못 사용하면 함수 호출이 애매해질 수 있습니다.
int pow2(int = 2, int = 3);
int foo()
{
return pow2() + pow2(3);
}
이 코드에서 pow2
함수는 두 매개변수 모두 디폴트 값(2
와 3
)이 지정된 버전으로 오버로딩됩니다. foo
함수는 인수 없이 pow2
를 호출하고, 하나의 인수만으로도 호출합니다.
사용 예:
cout << foo() << endl; // 출력: 11 (2^3 + 3^2 = 8 + 9)
여기서 pow2()
는 두 디폴트 값(2와 3)을 사용하고, pow2(3)
는 제공된 base 3
과 디폴트 지수 2
를 사용합니다.
이로써 C++의 디폴트 매개변수에 대한 심층 분석을 마칩니다. 이 기능을 효과적으로 활용하면 C++ 코드의 가독성과 유지보수성을 크게 향상시킬 수 있습니다.