콘텐츠로 이동

기본 인자 (Default Arguments)

기본 인자는 그 기본값이 언제나 같은 값을 가진다고 보장될 때 비가상 함수에 한해 허용됩니다. 함수 오버로딩과 같은 제약을 따르고, 기본 인자로 얻는 가독성이 아래의 단점을 넘어서지 못한다면 오버로드된 함수를 선호하세요.

장점:

기본값을 쓰는 함수가 있는데 가끔은 그 기본값을 덮어쓰고 싶은 경우가 많습니다. 기본 매개변수를 쓰면 드문 예외를 위해 함수를 여러 개 정의하지 않고도 이를 쉽게 할 수 있습니다. 함수를 오버로드하는 것에 비해 기본 인자는 문법이 더 깔끔하고, 상용구가 적으며, '필수' 인자와 '선택' 인자의 구분이 더 분명합니다.

단점:

기본 인자는 오버로드된 함수의 의미론을 얻는 또 하나의 방법이므로, 함수를 오버로드하지 말아야 할 이유가 모두 그대로 적용됩니다.

가상 함수 호출에서 인자의 기본값은 대상 객체의 정적 타입에 따라 결정되며, 어떤 함수의 모든 재정의가 같은 기본값을 선언한다는 보장이 없습니다.

기본 매개변수는 호출 지점마다 다시 평가되므로 생성되는 코드가 부풀 수 있습니다. 또한 읽는 사람은 기본값이 호출마다 달라지는 것이 아니라 선언 시점에 고정되어 있으리라 기대할 수 있습니다.

기본 인자가 있으면 함수 포인터가 혼란스러워집니다. 함수 시그니처가 호출 시그니처와 맞지 않는 경우가 많기 때문입니다. 함수 오버로드를 추가하면 이런 문제를 피할 수 있습니다.

결정:

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

그 밖의 어떤 경우에는 기본 인자가 함수 선언의 가독성을 위의 단점을 이겨 낼 만큼 높여 주므로 허용됩니다. 애매하면 오버로드를 쓰세요.


옮긴이 풀이

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

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

금지·주의

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

허용

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