본문 바로가기
Programming/C,C++

[C++] #2 함수 오버로딩(Function Overloading)과 디폴트 값(Default Value)

by yoiii 2020. 12. 22.

Goal

1.  함수 오버로딩의  개념에 대한 이해

2.  함수 매개변수 디폴트 값의 개념과, 사용방법


● 함수 오버로딩 (Function Overloading)


함수 오버로딩이란, 동일한 이름의 함수를 정의하여, 생산성을 높이는 방식이다.

그러나, C에서는 이를 허용하지 않았다.

왜냐하면, C와 C++은 호출할 함수를 찾는 방식이 다르기 떄문이다.

 

'함수의 이름' 으로 함수를 구분하는 C와 달리

C++은 '함수의 이름'과, '매개변수'로 함수를 구별한다.

 

따라서, 이름은 동일하고, 매개변수가 다른 여러개의 함수를 만들 수 있는것이다.

 

다음 예시를 보자.

#include <iostream>

void sum(int a, int b) {
	std::cout << a + b << std::endl;
}
void sum(int a, int b,int c) {
	std::cout << a + b + c << std::endl;
}
void sum(int a, int b, double c) {
	std::cout << a + b + c << std::endl;
}


int main(void)
{
	std::cout << "sum(int a,int b)호출" << std::endl;
	sum(1, 2);
	std::cout << "sum(int a,int b,int c)호출" << std::endl;
	sum(1, 2, 3);
	std::cout << "sum(int a,int b,float c)호출" << std::endl;
	sum(1, 2, 4.5);
}

 

sum 함수 3개를 오버로딩하여 작성해 보았다.

함수의 오버로딩이 성립하기 위해선 다음 조건이 성립해야 한다.

 

1. 동일한 함수의 이름

2. 서로 다른 매개변수

 

void sum(int a, int b) {
	std::cout << a + b << std::endl;
}

void sum(int a, int b,int c) {
	std::cout << a + b + c << std::endl;
}

1번째 함수는 매개변수가 2개이고,

2번째 함수는 매개변수가 3개이다.

따라서 매개변수의 '개수' 가 다르기에, 오버로딩의 사례로 적합하다.

 

void sum(int a, int b,int c) {
	std::cout << a + b + c << std::endl;
}
void sum(int a, int b, double c) {
	std::cout << a + b + c << std::endl;
}

 

1번째 함수는 매개변수 3개의 자료형이 모두 int형이지만,

2번째 함수의 3번째 매개변수의 자료형이 double형이다.

따라서 매개변수의 '형식'이 다르기에 오버로딩의 사례로 적합하다.

 

void sum(int a, int b) {
	std::cout << a + b << std::endl;
}
int sum(int a, int b) {
	std::cout << a + b << std::endl;
}

 

다음 두 함수는 오버로딩에 성공한 것일까?

정답은 아니다. 두 함수의 반환값은 각각 void형 int형으로 다르지만,

반환값은 함수의 오버로딩과 관련이 없다.

 

함수의 오버로딩의 조건 중

첫 번째 조건인. "동일한 함수의 이름"은 성립했지만,

두 번째 조건인, "서로 다른 매개변수"의 조건이 성립하지 않았기 때문이다.

 

● 디폴트 값(Default Value)


C++ 함수에는 '디폴트 값' 을 설정할 수 있다.

디폴트 값의 의미는 '기본적으로 설정되어 있는 값'이다.

 

#include <iostream>

void MySum(int a=1, int b=2)
{
	std::cout << a + b << std::endl;
}


int main(void)
{
	std::cout << "MySum(int a,int b)호출" << std::endl;
	MySum(10, 20);
	std::cout << "MySum(int a,int b)호출" << std::endl;
	MySum();
}

 

MySum함수를 해석해보자면 다음과 같다.

만약, a의 값이 전달되지 않았다면 a는 1로 간주하고,

b의 값이 전달되지 않았다면 b는 2로 간주한다.

 

MySum(10, 20);

 

따라서, 다음과 같이 정상적으로, 매개변수의 값을 보내주면,

10과 20의 값을 더해서, 30 을 출력한다.

 

MySum();

 

그러나, 이렇게, 매개변수의 값을 보내주지 않으면, 초기에 설정해 둔 디폴트값인 1과 2가 더해져서 3을 출력한다.

다음으로, 디폴트값을 설정할 때 쉽게 범하는 오류에 대해 알아보자.

 

void MySum(int a=1, int b)
{
	std::cout << a + b << std::endl;
}

 

언뜻보면, 정상적으로 디폴트 값을 설정한 것처럼 보인다.

그러나, 이는 잘못된 코드이다.

 

void MySum(int a, int b=1)
{
	std::cout << a + b << std::endl;
}

 

디폴트 값은 무조건 오른쪽의 매개변수부터 채우는 형태로 정의해야 한다.

 

왜냐하면, 함수에 전달되는 인자는 왼쪽에서부터 오른쪽으로 채워지기 떄문이다.

생각해보면 당연한 말이다.

 

MySum함수에 3을 보낸다고 생각해 보자.

void MySum(int a,int b=1) 와 같이 디폴트 값을 오른쪽부터 채운 함수의

a의 값은 3이 되고 , b는 설정해 둔 1이 될 것이다.

 

그러나 void MySum(int a=1,int b) 와 같이 디폴트 값을 왼쪽부터 채운 함수에 3을 보낸다고 생각해보자.

a의 값을 3으로 설정되겠지만, b의값은 설정해 둔 디폴트 값도 없고, 보낸 인자도 없기에, 컴파일 에러가 난다.


 

댓글