함수 오버로딩(Function Overloading)


C언어에서는 다음과 같이 동일한 이름의 함수가 정의되는 것을 허용하지 않는다.

두 함수의 이름이 같기 때문에 컴파일 오류가 발생한다.


  1. int func(int num){  
  2.     num++;  
  3.     return num;  
  4. }  
  5.   
  6. int func(int a, int b){  
  7.     return a + b;  
  8. }  




C++에서는 함수호출 시 전달되는 인자를 통해서 호출하고자 하는 함수의 구분이 가능하다.

즉 매개변수의 형태가 다르다면 동일한 이름의 함수를 정의할 수 있다 이를 함수 오버로딩 이라 한다.


그렇다면? C언어가 함수 오버로딩을 허용하지 않는 이유는 무엇일까?


호출하는 함수를 찾는 방법이 서로 다르기 때문이다.


C++ 

함수 이름 

함수의 이름, 매개변수의 선언 


C++는 함수의 이름과 매개변수 두가지 정보를 활용하지만 

C언어는 함수의 이름만을 이용하여 호출 대상을 찾는다.


따라서 C언어에서는 함수의 오버로딩이 불가능하다.



예제


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



예제 결과




문제 : 다음 main( )함수에서 필요로 하는 swap 함수를 오버로딩 해서 구현해보자


  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. int main(void) {  
  5.     int num1 = 20, num2 = 30;  
  6.     swap(&num1, &num2);  
  7.     cout << num1 << ' ' << num2 << endl;  
  8.   
  9.     char ch1 = 'A', ch2 = 'Z';  
  10.     swap(&ch1, &ch2);  
  11.     cout << ch1 << ' ' << ch2 << endl;  
  12.   
  13.     double dbl1 = 1.1111, dbl2 = 5.5555;  
  14.     swap(&dbl1, &dbl2);  
  15.     cout << dbl1 << ' ' << dbl2 << endl;  
  16.   
  17.     return 0;  
  18. }  




  1. void swap(int *a, int *b){  
  2.     int tmp = *a;  
  3.     *a = *b;  
  4.     *b = tmp;  
  5. }  
  6.   
  7. void swap(char *a, char*b) {  
  8.     char tmp = *a;  
  9.     *a = *b;  
  10.     *b = tmp;  
  11. }  
  12.   
  13. void swap(double *a, double *b) {  
  14.     double tmp = *a;  
  15.     *a = *b;  
  16.     *b = tmp;  
  17. }  




매개변수의 디폴트 값 (Default Value)


C++에서는 매개변수를 다음의 형태로 선언하는 것이 가능하다.


  1. int func1(int num = 7) {  
  2.     return num + 1;  
  3. }  
  4.   
  5. int func2(int num1 = 5, int num2 = 7) {  
  6.     return num1 + num2;  
  7. }  


  • 함수호출 시 인자를 전달하지 않으면  7이 전달된 것으로 간주한다.
  • 함수호출 시 인자를 전달하지 않으면 5와 7이 전달된 것으로 간주한다.

예제1

  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. int addr(int num1 = 1, int num2 = 2) {  
  5.     return num1 + num2;  
  6. }  
  7.   
  8. int main() {  
  9.     cout << addr() << endl;  
  10.     cout << addr(5) << endl;  
  11.     cout << addr(3, 5) << endl;  
  12.   
  13.     return 0;  
  14. }  



예제 결과




주의할 점


 유효

유효하지 않음 

 int func(int num1=2) {. . .}

 int func(int num1=2, num2) {. . .}

 int func(int num1=1, int num2=3) {. . .} 

 int func(int num1=3, num2=5, num3) {. . .}

 int func(int num1, int num2=3) {. . .}

 int func(int num1, num2=3, num3) {. . .}

 int func(int a, int b, intc=4) {. . .}

 int func(int num1=2, num2, num3) {. . .}


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

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


예제2


  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. int bvm(int len, int wd = 1, int hei = 1) {  
  5.     return len * wd * hei;  
  6. }  
  7.   
  8. int main() {  
  9.     cout << "[3,3,3] : " << bvm(3, 3, 3) << endl;  
  10.     cout << "[5,5,D] : " << bvm(5, 5) << endl;  
  11.     cout << "[7,D,D] : " << bvm(7) << endl;  
  12.     cout << "[D,D,D] : " << bvm() << endl;  
  13.   
  14.     return 0;  
  15. }  


  • 첫 번째 매개변수에는 디폴트 값이 지정되어 있지 않다.
  • bvm함수를 호출할 때에는 반드시 하나 이상의 인자를 전달해야 한다.
  • 12행에서 인자를 전달하지 않았기 때문에 컴파일 에러가 발생한다.

문제

문제 1 : 위의 함수를 매개 변수 디폴트 값 지정 형태가 아닌 함수 오버로딩의 형태로 재 구현 하라.

문제 2 다음과 같은 형태로의 함수 오버로딩은 문제가 있다. 어떠한 문제가 있는지 설명해보자.

  1. int test(int a = 10){  
  2.     return a + 1;  
  3. }  
  4.   
  5. int test(void){  
  6.     return 10;  
  7. }  



문제 1

  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. int bvm(int len = 1) {  
  5.     return len;  
  6. }  
  7. int bvm(int len, int wid) {  
  8.     return len*wid;  
  9. }  
  10. int bvm(int len, int wid, int hei) {  
  11.     return len*wid*hei;  
  12. }  
  13.   
  14. int main() {  
  15.     cout << "[3,3,3] : " << bvm(3, 3, 3) << endl;  
  16.     cout << "[5,5,D] : " << bvm(5, 5) << endl;  
  17.     cout << "[7,D,D] : " << bvm(7) << endl;  
  18.     cout << "[D,D,D] : " << bvm() << endl;  
  19.   
  20.     return 0;  
  21. }  



문제 2


함수 오버로딩의 조건을 만족해서 컴파일은 된다, 하지만 다음과 같이 인자를 전달하지 않으면서 함수를 호출하는 경우, 두함수를 모두 호출 조건을 만족하기 때문에 컴파일 에러가 발생한다.

'Language > C++' 카테고리의 다른 글

6. C++ 기본(6)  (0) 2016.12.13
5. C++ 기본(5) - OOP 단계별 프로젝트 01  (0) 2016.12.12
4. C++ 기본(4)  (0) 2016.12.11
3. C++ 기본(3)  (0) 2016.12.09
1. C++ 기본  (0) 2016.12.08

+ Recent posts