본문 바로가기
C++/윤성우 열혈 C++ 프로그래밍

01-3 매개변수의 디폴트 값

by 대소기 2021. 9. 26.
  • C++의 함수에는 매개변수의 기본 값을 뜻하는 default value를 설정해줄 수 있다.
  • 인자를 전달하지 않으면 디폴트 값으로 매개변수가 초기화 된다.
  • 때문에 default value가 설정되어 있으면 함수의 매개변수의 개수보다 적은 수의 매개변수를 전달해도 함수가 작동한다. 단, 전달되는 매개변수는 왼쪽으로부터 채워진다.
#include <iostream>

int Adder(int num1=1, int num2=2)
{
    return num1+num2;
}

int main(void)
{
    std::cout<<Adder()<<std::endl;
    std::cout<<Adder(5)<<std::endl;
    std::cout<<Adder(3,5)<<std::endl;
    return 0;
}

실행결과
3
7
8

  • 함수의 원형을 별도로 선언할 경우에는 default value를 원형 선언 부분에 포함시켜야 한다. 함수의 정의 부분에 포함시킬 수 없다(함수의 선언 부분에 위치하지 않는다면 8,9행 컴파일 불가).
#include <iostream>

#함수의 선언
int Adder(int num1=1, int num2=2);

int main(void)
{
    std::cout<<Adder()<<std::endl;
    std::cout<<Adder(5)<<std::endl;
    std::cout<<Adder(3,5)<<std::endl;
    return 0;
}

#함수의 정의
int Adder(int num1, int num2)
{
    return num1+num2;
}

부분적 디폴트 값 설정

  • 매개변수의 default value를 모두 설정해 둘 수도 있지만, 일부 매개변수만 default value를 지정할 수도 있다.
  • 하지만, 이 때 default value를 가장 오른쪽 매개변수부터 지정해줘야 한다. 매개변수가 함수에 전달될 때는 왼쪽부터 전달되기 때문에 default value는 오른쪽부터 채워준다.

01-3 연습문제

문제 1)

  • 위 코드와 결과가 같도록 함수 BoxVolume을 함수 오버로딩을 사용하여 구현해보아라. main함수는 변경할 수 없다.
#include <iostream>

int BoxVolume(int length, int width=1, int height=1)

int main(void)
{
    std::cout<<"[3, 3, 3]: "<<BoxVolume(3, 3, 3)<<std::endl;
    std::cout<<"[5, 5, D]: "<<BoxVolume(5, 5)<<std::endl;
    std::cout<<"[7, D, D]: "<<BoxVolume(7)<<std::endl;
    // std::cout<<"[D, D, D]: "<<BoxVolume()<<std::endl;
    return 0;
}

int BoxVolume(int length, int width, int height)
{
    return length*width*height;
}

실행 결과
[3, 3, 3]: 27
[5, 5, D]: 25
[7, D, D]: 7

해답

#include <iostream>

int BoxVolume(int length, int width, int height)
{
    return length*width*height;
}

int BoxVolume(int length, int width)
{
    return length*width;
}

int BoxVolume(int length)
{
    return length;
}

int main(void)
{
    std::cout<<"[3, 3, 3]: "<<BoxVolume(3, 3, 3)<<std::endl;
    std::cout<<"[5, 5, D]: "<<BoxVolume(5, 5)<<std::endl;
    std::cout<<"[7, D, D]: "<<BoxVolume(7)<<std::endl;
    // std::cout<<"[D, D, D]: "<<BoxVolume()<<std::endl;
    return 0;
}

문제 2)

  • 다음과 같은 형태로의 함수 오버로딩 문제가 있다. 어떠한 문제가 있는지 설명해보자.
int SimpleFunc(int a=10)
{
    return a+1;
}

int SimpleFunc(void)
{
    return 10
}

해답 : 매개변수가 1개이고 int형인 SimpleFunc는 매개변수의 default value가 존재한다. 때문에 매개변수가 없는 동일한 이름의 함수를 생성하면, default value를 사용하려고 매개변수를 전달하지 않은 채로 SimpleFunc를 호출하면 중복 호출이 발생한다. 때문에 컴파일 오류가 발생한다.