Software Development/C, C++

[C++] 함수 오버로딩과 매개변수의 디폴트 값

huiyu 2018. 11. 25. 11:48

1. 함수 오버로딩 (Function Overloading)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
int MyFunc(int num)
{
  num++;
  return num;
}
 
int MyFunc(int a, int b)
{
  return a+b;
}
 
int main(void)
{
  MyFunc(20);// MyFunc(int num)함수 호출
  MyFunc(3040); //MyFunc(int a, int b) 함수 
 
  return 0;
}
cs


C언어에선 위와 같이 동일한 함수가 정의된다면 컴파일 오류가 발생한다.
그러나 C++에선 이를 허용하고 있으며, 이러한 형태의 함수정의를 가리켜 '함수 오버로딩(Function Overloading)'이라 한다.

main함수에 주석에서 설명하듯이 함수 호출 시 전달되는 인자를 통해서 호출하고자 하는 함수의 구분이 가능하다.
매개변수의 선언형태가 다르다면, 동일한 이름의 함수정의를 허용하고 있다.


*C++은 '함수 오버로딩'을 허용하지만, C언어는 허용하지 않는 이유
 -> C++은 호출할 함수를 찾을 때, '함수 이름', '매개변수의 선언' 두가지를 모두 판단하고 함수를 찾는다.
  그러나 C언어는 함수의 이름만 이용해서 호출대상을 찾는다.


- 함수의 오버로딩이 가능하려면 매개변수의 선언이 달라야 한다.
  int MyFunc(char c) {...}
  int MyFunc(int n) {...}

- 매개변수의 개수가 달라도 호출할 함수의 구분이 가능하여 이도 가능하다.
  int MyFunc(int n)
  int MyFunc(int n1, int n2)

- 반환형이 다른 함수의 경우 구분하는 기준이 될수 없다. 이는 컴파일 오류 발생
  void MyFunc(int n)
  int MyFunc(int n)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
 
void MyFunc(void)
{
  std::cout<<"MyFunc(void called"<<std::endl;
}
 
void MyFunc(char c)
{
  std::cout<<"MyFunc(char c) called"<<std::endl;
}
 
void MyFunc(int a, int b)
{
  std::cout<<"MyFunc(int a, int b) called"<<std::endl;
}
 
int main(void)
{
  MyFunc();
  MyFunc('A');
  MyFunc(1213);
 
  return 0;
}
cs

[출력결과]
 MyFunc(void) called
 MyFunc(chr c) called
 MyFunc(int a, int b) called

-> 함수오버로딩은 함수이름이 같을 경우 전달되는 인자로 구분하여 호출해준다.


2. 매개변수의 디폴트 값(Defalut Value)

 C++ 함수에는 '디폴트 값'을 설정할 수 있다. 디폴트 값이란 기본적으로 설정되어 있는 값을 의미한다.

1
2
3
4
5
6
7
8
9
int MyFuncOne(int num = 7)
{
  return num + 1;
}
 
int MyFuncTwo(int num1=5int num2=7)
{
  return a+b;
}
cs

MyFuncOne은 "함수 호출 시 인자를 전달하지 않으면 7이 전달된 것으로 간주하겠다"란 의미이다.
따라서 호출 시 인자가 없을 경우,
 MyFuncOne();//
이는 MyFuncOne(7)과 완전히 동일하다.

MyFuncTwo()역시 인자 전달이 없을 경우, num1=5, num2=7가 전달된 것으로 간주한다.


또한 디폴트 값이 설정되어 있으면, 선언된 매개변수의 수보다 적은 수의 인자 전달이 가능하다.
전달되는 인자는 왼쪽에서부터 채워져 나가고, 부족분은 디폴트 값으로 채워진다.

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
 
int Adder(int num1=1int 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;
}
cs

[출력결과]
 3
 7
 8

* 부분적 디폴트 값 설정

 int YourFunc(int num1, int num2=5, int num3=7){...}
 int YourFunc(int num1, int num2,  int num3=7){...}

위 함수와 같이 부분적으로 디폴트값을 비우거나 채우는 형태로 선언이 가능하다.
그러나 반드시 오른쪽 매개변수의 디폴트 값부터 채우는 형태로 정의해야 한다.

이는 함수에 전달되는 인자가 왼쪽에서부터 오른쪽으로 채워지기 때문


[출처]
윤성우의 열혈 C++프로그래밍
  01-2함수 오버로딩(Function Overloading)
  01-3매개변수의 디폴트 값(Defalut Value)

728x90