디폴트 매개변수

Jaemyeong Lee·2024년 8월 9일
0

FastCampusC++

목록 보기
43/78

C++의 디폴트 매개변수 예제 분석

디폴트 매개변수는 C++의 강력한 기능 중 하나로, 함수 호출 시 선언된 매개변수보다 적은 인수를 전달할 수 있게 해줍니다. 인수가 제공되지 않으면, 컴파일러는 함수 선언 또는 정의에서 지정된 기본값을 사용합니다. 이 기능을 통해 함수 호출이 간소화되고 중복이 줄어들어 코드가 더 깔끔하고 유지보수하기 쉬워집니다.

이번 블로그 포스트에서는 디폴트 매개변수가 어떻게 동작하는지, 어디에 지정될 수 있는지, 그리고 몇 가지 중요한 규칙과 모범 사례를 C++ 코드 예제를 통해 자세히 알아보겠습니다.

1. 기본적인 디폴트 매개변수 사용

먼저, 지수 연산을 수행하는 간단한 함수 예제를 살펴보겠습니다.

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를 사용)

2. 모든 매개변수에 디폴트 값 설정

다음 예제에서는 모든 매개변수에 디폴트 값이 설정된 함수입니다.

int pow1(int base = 2, int exp = 2)
{
    return pow0(base, exp);
}

이 경우 pow1 함수는 인수가 없이도 호출할 수 있습니다.

사용 예:

cout << pow1() << endl; // 출력: 4 (2^2, base와 exp 모두 2로 디폴트)

3. 함수 프로토타입에서의 디폴트 매개변수

디폴트 매개변수는 함수 프로토타입에서 지정될 수도 있습니다. 이 경우, 헤더 파일이나 소스 파일의 맨 처음에 위치하게 됩니다.

int pow2(int base, int exp);
int pow2(int, int = 2);

pow2 함수는 두 개의 매개변수로 선언되었지만, 나중에 exp 매개변수에 2라는 디폴트 값이 지정된 프로토타입이 제공됩니다.

사용 예:

cout << pow2(2) << endl;  // 출력: 4 (2^2)

pow2 함수는 하나의 인수만으로 호출되었고, 컴파일러는 exp의 디폴트 값인 2를 사용했습니다.

4. 구조체와 객체에서의 디폴트 매개변수 사용

디폴트 매개변수는 원시 타입에만 국한되지 않고, 사용자 정의 타입에서도 사용할 수 있습니다.

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 객체 사용)

5. 동적 메모리 할당에서의 디폴트 매개변수

포인터와 동적 메모리를 사용할 때, 디폴트 매개변수는 유효한 객체가 제공되지 않은 경우를 처리하는 데 유용할 수 있습니다.

void print(Person* p0 = nullptr)
{
    if (p0)
    {
        cout << p0->weight << endl;
        cout << p0->height << endl;
    }
    else
    {
        cout << "invalid" << endl;
    }
}

print 함수에서 만약 nullptr이 전달되거나 인수가 없이 호출되면 "invalid"를 출력합니다. 유효한 Person 객체가 제공되면, 해당 객체의 weightheight를 출력합니다.

사용 예:

print();  // 출력: invalid
Person p{ 74.f, 183.f };
print(&p); // 출력: 74 183

6. 함수 오버로딩과 디폴트 매개변수

디폴트 매개변수와 함수 오버로딩을 함께 사용할 때, 잘못 사용하면 함수 호출이 애매해질 수 있습니다.

int pow2(int = 2, int = 3);

int foo()
{
    return pow2() + pow2(3);
}

이 코드에서 pow2 함수는 두 매개변수 모두 디폴트 값(23)이 지정된 버전으로 오버로딩됩니다. foo 함수는 인수 없이 pow2를 호출하고, 하나의 인수만으로도 호출합니다.

사용 예:

cout << foo() << endl; // 출력: 11 (2^3 + 3^2 = 8 + 9)

여기서 pow2()는 두 디폴트 값(2와 3)을 사용하고, pow2(3)는 제공된 base 3과 디폴트 지수 2를 사용합니다.

요약

  • 디폴트 매개변수는 중복을 줄이고 함수 호출을 간소화하지만, 애매함을 피하기 위해 신중하게 사용해야 합니다.
  • 디폴트 매개변수는 함수 선언 또는 프로토타입에서 설정할 수 있으며, 컴파일 유닛당 매개변수마다 한 번만 지정할 수 있습니다.
  • 함수 선언에서 디폴트 매개변수를 지정한 경우, 함수 정의에서 다시 반복하지 않아야 합니다.
  • 함수 오버로딩과 디폴트 매개변수를 함께 사용할 때는 애매함을 방지하기 위해 신중하게 처리해야 합니다.
  • 디폴트 매개변수는 원시 타입뿐만 아니라 구조체와 같은 복합 객체에서도 사용할 수 있습니다.

이로써 C++의 디폴트 매개변수에 대한 심층 분석을 마칩니다. 이 기능을 효과적으로 활용하면 C++ 코드의 가독성과 유지보수성을 크게 향상시킬 수 있습니다.

profile
李家네_공부방

0개의 댓글