NeuroWhAI의 잡블로그

[C++] 기본 인수(Default arguments) 고급 본문

개발 및 공부/언어

[C++] 기본 인수(Default arguments) 고급

NeuroWhAI 2018. 8. 4. 21:15


C++을 오래전 처음 배우면서 기본 인수(혹은 디폴트 매개변수, 기본 매개변수)라는 문법을 봤었고

"음 간단하네"라고 생각하며 자주 사용해왔었습니다.

그러나 오늘 어떤 글을 보게 되었고 기본 인수 문법에 대한 이해도가 더 오르게 되었습니다.

정리하고자 글을 씁니다.

int sum(int a, int b = 2)
{
    return a + b;
}

int main()
{
    cout << sum(1, 2) << endl;
    cout << sum(1) << endl;

    return 0;
}

위 코드가 흔한 기본 인수 문법의 예시이고 다들 이렇게만 사용했을겁니다.

(사실 아래의 내용은 지식으로서만 알아두시고 이렇게만 사용하는게 좋을 것 같긴 합니다)

그러나 아래 코드를 봅시다.

int sum(int a, int b)
{
    return a + b;
}

int main()
{
    cout << sum(1, 2) << endl;
    
    int sum(int a, int b = 2);
    cout << sum(1) << endl;
    
    int sum(int a = 1, int b);
    cout << sum() << endl;

    return 0;
}

이런 용례를 처음 보시면 당황스러울 수 있지만 찬찬히 보면 바로 이해할 순 있습니다.

보면 마치 기본 인수를 '추가'하는 듯한 모습이고 실제로도 그렇게 되어 출력은 전부 3이 나오게 됩니다.

이미 기본 인수가 추가된 인자(파라미터)에는 다시 기본 인수를 설정할 수 없지만 스코프가 다르다면 가능합니다.

그 내용은 마지막에 다루겠습니다.


이번엔 아래 코드를 봅시다.

int sum(int a, int b)
{
    return a + b;
}

int g_val = 2;
int foo(int f = sum(1, g_val))
{
    return f * f;
}

int main()
{
    cout << foo() << endl;
    g_val = 1;
    cout << foo() << endl;

    return 0;
}

결과는 9, 4입니다.

즉, 기본 인수 표현식은 함수를 호출할때 실행된다는 것입니다.


마지막으로 첫 코드의 확장판(?)으로 글을 마치겠습니다.

int sum(int a, int b)
{
    return a + b;
}

int sum(int a, int b = 2); // #1

void foo()
{
    // int sum(a = 1, int b);
    // Error! #1에서 b에는 기본 인수를 지정해줬으니 될거라고 생각할 수 있지만
    // 스코프가 다르면 선언시의 기본 인수를 취득해오지 않는다.

    cout << sum(1) << endl; // 3: #1
    // 호출시의 기본 인수는 스코프가 다른 곳에서도 취득해올 수 있다.

    int sum(int a = 1, int b = 3); // #2
    // #1에서 b에 기본 인수가 있지만 #1과 #2는 선언된 스코프가 다르므로 문제 없음.
    cout << sum() << endl; // 4: #2
    
    // int sum(int a, int b = 4);
    // Error! 같은 스코프에 있는 #2에서 이미 b에 기본 인수를 지정했음.
}

int sum(int a = 4, int b); // #3

void bar()
{
    cout << sum() << endl; // 6: #1 + #3
    
    int sum(int a, int b);
    // cout << sum() << endl;
    // Error! 기본 인수가 재정의 되었으므로 a, b에 기본 인수가 없는 상태.
    
    int sum(int a = 5, int b = 6); // #4
    cout << sum() << endl; // 11: #4
}

int main()
{
    foo();
    bar();

    return 0;
}




Comments