C++기초

220324(1)_함수(2)_함수의 오버로딩, 디폴트 인자

hyrule 2022. 4. 5. 15:05
#include <iostream>

int Add(int Number1, int Number2)
{

	return Number1 + Number2;
}

//위 함수에는 정수만 넣을 수 있다.
//만약에 소수점을 넣으면 소수점이 잘리게 될 것이다.
//만약에 우리가 float 타입을 연산하면 float 타입을 반환하고 싶으면
//새로 함수를 만들어야 된다.
/*
함수의 오버로딩: 같은 이름으로 함수를 만들어줄 때 인자의 개수 혹은 타입이 서로 다를 경우 같은 이름으로 함수를 정의하는 것이 가능하다.
이를 함수의 오버로딩이라 한다.
cf)네임 맹글링

반환타입은 함수의 오버로딩에 영향을 줄 수 없다.
무조건 인자의 갯수 혹은 타입으로만 함수 오버로딩을 할 수 있다.
*/

float Add(float Number1, float Number2)
{
	return Number1 + Number2;
}

int Add(int Num1, int Num2, int Num3)
{
	return Num1 + Num2 + Num3;
}



/*
함수의 인자는 호출시 값을 무조건 넣어주어야 한다.
하지만 함수의 디폴트 인자를 사용하게 되면 값을 넣어주어도 되고 안 넣어주어도 된다.
함수의 디폴트 인자는 함수의 인자에 이 인자가 가질 기본값을 정의해주어서 외부에서 함수를 호출할 때 값을 넣어주면 해당 값으로 설정을 하고 값을 비워두면 기본값으로 설정이 되게 된다.
디폴트  인자는 함수의 인자중 가장 오른쪽부터 설정해야 한다.
오른쪽 인자는 디폴트 인자가 아니고 왼쪽 인자가 디폴트인자일 경우 에러가 발생한다
ex)int Add1(int Number1 = 10, int Number2) //에러
*/

int Add1(int Number1, int Number2 = 10)
{
	return Number1 + Number2;
}


//함수 오버로딩 시에 디폴트 인자를 잘못 사용하면 오버로딩에 문제가 발생할 수 있다.
int Add2(int Number1, int Number2 = 20)
{
	return Number1 + Number2;
}

int Add2(int Number1)
{
	return Number1;
}
//위의 두 함 수 모두 인자 1개만 넣어주어도 동작이 되기 떄문에 함수를 호출 시 인자를 1개만 넣어서 호출하게 되면 둘 중 어떤 함수를 동작시켜야 할 지 판단할 수 없기 때문에 에러가 발생한다.


int main()
{

	std::cout << Add(10, 20) << std::endl;



	//디폴트 함수 테스트
	std::cout << "함수에 값을 넣었을 경우 : " << Add1(50, 60) << std::endl;
	std::cout << "함수에 값을 안 넣었을 경우(디폴트 인자 사용) : "
		<< Add1(50) << std::endl;

	return 0;
}