콘텐츠로 이동

기본 인자 (Default Arguments)

기본값이 항상 동일한 값을 갖도록 보장되는 경우 가상이 아닌 함수에 기본 인수가 허용됩니다. 함수 오버로딩과 동일한 제한 사항을 따르고, 기본 인수로 얻은 가독성이 아래 단점보다 크지 않으면 오버로드된 함수를 선호합니다.

기본값을 사용하는 함수가 있는 경우가 많지만 때로는 기본값을 재정의하고 싶을 때도 있습니다. 기본 매개변수를 사용하면 드문 예외에 대해 많은 함수를 정의하지 않고도 이 작업을 쉽게 수행할 수 있습니다. 함수 오버로드에 비해 기본 인수는 더 깔끔한 구문을 가지며, 상용구가 적고 '필수' 인수와 '선택적' 인수 간의 구분이 더 명확합니다.

기본 인수는 오버로드된 함수의 의미를 달성하는 또 다른 방법이므로 함수를 오버로드하지 않는 모든 이유가 적용됩니다.

가상 함수 호출에서 인수의 기본값은 대상 개체의 정적 유형에 따라 결정되며 지정된 함수의 모든 재정의가 동일한 기본값을 선언한다는 보장은 없습니다.

기본 매개변수는 각 호출 사이트에서 재평가되므로 생성된 코드가 커질 수 있습니다. 독자는 기본값이 호출할 때마다 달라지는 대신 선언 시 고정될 것으로 기대할 수도 있습니다.

함수 포인터는 기본 인수가 있으면 혼란스럽습니다. 함수 서명이 호출 서명과 일치하지 않는 경우가 많기 때문입니다. 함수 오버로드를 추가하면 이러한 문제를 피할 수 있습니다.

기본 인수는 가상 함수에서 금지됩니다. 이 경우 제대로 작동하지 않으며, 지정된 기본값이 평가 시기에 따라 동일한 값으로 평가되지 않을 수 있습니다. (예를 들어 void f(int n = counter++); 이라고 쓰지 마세요.)

다른 경우에는 기본 인수가 위의 단점을 극복할 만큼 함수 선언의 가독성을 향상시킬 수 있으므로 허용됩니다. 의심스러운 경우에는 과부하를 사용하십시오.


이해하기 쉽게 설명하기

핵심: 비가상 함수에 한해, 기본값이 항상 같을 때만 허용

기본 인자는 비가상 함수에서, 기본값이 항상 동일하게 보장될 때만 허용됩니다. 기본 인자는 오버로딩의 또 다른 형태이므로, 오버로딩을 피하는 모든 이유가 그대로 적용됩니다. 가독성 이득이 단점보다 크지 않으면 오버로드를 선호하세요.

금지·주의

  • 가상 함수에서는 금지: 기본값은 객체의 정적 타입으로 결정되어, 재정의가 다른 기본값을 선언해도 무시됩니다. 의도와 다르게 동작합니다.
  • 호출마다 재평가: 기본값은 호출 지점마다 다시 평가되어 코드가 커질 수 있고, void f(int n = counter++);처럼 호출마다 값이 달라지는 함정이 생깁니다(이렇게 쓰지 마세요).
  • 함수 포인터: 기본 인자가 있으면 함수 시그니처와 호출 시그니처가 안 맞아 혼란스럽습니다.

허용

이런 단점을 넘어설 만큼 선언의 가독성을 높이는 경우엔 허용됩니다. 의심스러우면 오버로드를 쓰세요.