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(30, 40); //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(12, 13); 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=5, int 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=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; } | 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)
'Software Development > C, C++' 카테고리의 다른 글
[C++] namespace & using (0) | 2018.12.02 |
---|---|
[C++] 인라인(inline) 함수 (0) | 2018.12.02 |
[C++] cin, cout을 이용한 입출력 (0) | 2018.11.25 |
C언어로 게임만들기 - 5. 첫번째 게임_5)코드정리 (3) | 2017.03.28 |
C언어로 게임만들기 - 5. 첫번째 게임_4)충돌처리 (1) | 2017.03.21 |