함수 오버로딩(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

출력


  1. #include <iostream>  
  2.   
  3. int main() {  
  4.     int num = 20;  
  5.     std::cout << "Hello world" << std::endl;  
  6.     std::cout << "Hello" << "World" << std::endl;  
  7.     std::cout << num << ' ' << 'A';  
  8.     std::cout << ' ' << 3.14 << std::endl;  
  9.   
  10.     return 0;  
  11. }  



  • std :: cout << '출력대상'
출력 대상의 위치에는 무엇이든 올 수 있다. (정수, 실수, 문자열, 변수 etc...)

C언어의 printf 함수와 달리 서식문자를 이용해서 별도의 출력포맷을 지정하지 않아도 적절한 출력이 이뤄진다,


  • <<연산자를 이용한 출력대상의 연이은 표현과 개행
std :: cout << '출력대상1' << '출력대상2' << '출력대상3'; 과 같이 쓸 수 있다.
<<연산자를 이용한 std :: endl;의 출력은 개행으로 이어진다.


입력

  1. #include <iostream>  
  2.   
  3. int main() {  
  4.     int num1;  
  5.     std::cout << "input num : ";  
  6.     std::cin >> num1;  
  7.   
  8.     int num2;  
  9.     std::cout << "input num2 :";  
  10.     std::cin >> num2;  
  11.   
  12.     int result = num1 + num2;  
  13.     std::cout << "result : " << result << std::endl;  
  14.   
  15.     return 0;  
  16. }  


  • 데이터 입력에 사용되는 std :: cin 과 >> 연산자
키보드로부터의 데이터 입력을 위해서는 std :: cin >> '변수' ; 와 같은 형태를 취한다.
C++에서는 데이터의 입력도 출력과 마찬가지로 별도의 포맷 지정이 필요 없다.

  • 문자열과 같은 경우 또한 마찬가지로 별도의 포맷 지정이 필요 없다.
char str[100];
std :: cin >> str;


지역 변수 선언

  1. #include <iostream>  
  2.   
  3. int main() {  
  4.     int num1, num2;  
  5.     int result = 0;  
  6.   
  7.     std::cout << "input two numers";  
  8.     std::cin >> num1 >> num2;  
  9.   
  10.     if (num1 < num2) {  
  11.         for (int i = num1 + 1; i < num2; i++)  
  12.             result += i;  
  13.     }  
  14.     else {  
  15.         for (int i = num2 + 1; i < num1; i++)  
  16.             result += i;  
  17.     }  
  18.   
  19.     std::cout << result << std::endl;  
  20.   
  21.     return 0;  
  22. }  

  • 연속적인 데이터의 입력을 요구할 수 있다.
std :: cin>>'변수1' >> '변수2' ;
변수의 경계는 탭, 스페이스바, enter키의 입력과 같은 공백에 의해 나눠진다.

  • for문의 초기화 문장 내에서 변수 선언이 가능하다.
for (int num=0 ; num<10 ; num++){. . .}


배열 기반의 문자열 입출력

  1. #include <iostream>  
  2.   
  3. int main() {  
  4.     char name[100];  
  5.     char lang[100];  
  6.   
  7.     std::cout << "input your name : ";  
  8.     std::cin >> name;  
  9.   
  10.     std::cout << "what's your favorite language? : ";  
  11.     std::cin >> lang;  
  12.   
  13.     std::cout << "your name is : " << name << "^^\n";  
  14.     std::cout << "your favorite language is : " << lang << std::endl;  
  15.       
  16.     return 0;  
  17. }  


  • "\n"과 같은 특수문자는 C언어에서와 같은 의미를 지닌다. std :: endl로 개행의 역할을 대신할 뿐이다.
  • 9행, 12행 : 배열에 문자열의 저장을 명령하고 있다.

문제

문제 1. 사용자로부터 총 5개의 정수를 입력받아서 그 합을 출력하는 프로그램을 작성하라

문제 2. 프로그램 사용자로부터 이름과 전화번호를 문자열의 형태로 입력받아 출력하는 프로그램을 작성하라.

문제 3. 숫자 하나를 입력 받아서 그 숫자에 해당하는 구구단을 출력하는 프로그램을 작성하라.

문제 4. 
판매원들의 급여 계산 프로그램을 작성해보자. 모든 판매원에게 매달 50만원의 기본급여와 물품 판매 가격의 12%에 해당하는 돈을 지급한다. 예를들어 민수라는 친구의 이번달 물품 판매 금액이 100만원이라면 50 + 100*0.12=62 따라서 62만원을 급여로 지급받는다. 단 -1이 입력될 경우 프로그램을 종료한다.




문제1.

  1. #include <iostream>  
  2.   
  3. int main()  
  4. {  
  5.     int num[5];  
  6.     int hab=0;  
  7.   
  8.     for (int i = 0; i < 5; i++) {  
  9.         std::cout << "input num " << i+1 << std::endl;  
  10.         std::cin >> num[i];  
  11.         hab += num[i];  
  12.     }  
  13.     std::cout << "hab : " << hab << std::endl;  
  14.   
  15.     return 0;  
  16. }  

문제2.

  1. #include <iostream>  
  2.   
  3. int main() {  
  4.     char name[100];  
  5.     char phone[100];  
  6.   
  7.     std::cout << "input your name : ";  
  8.     std::cin >> name;  
  9.     std::cout << "input your phone numbr : ";  
  10.     std::cin >> phone;  
  11.   
  12.     std::cout << "your name is : " << name << std::endl;  
  13.     std::cout << "your phone number is : " << phone << std::endl;  
  14.   
  15.     return 0;  
  16. }  

문제3. 

  1. #include <iostream>  
  2.   
  3. int main() {  
  4.     int num;  
  5.     std::cin >> num;  
  6.   
  7.     for (int i = 1; i <= 9; i++)   
  8.         std::cout << num << "*" << i << "=" << num*i << std::endl;  
  9.       
  10.       
  11.     return 0;  
  12. }  

문제4.

  1. #include <iostream>  
  2.   
  3. int main() {  
  4.     int ins=0;  
  5.     int sal;  
  6.     int perf;  
  7.   
  8.     while (1) {  
  9.           
  10.         std::cout << "input salary performance : ";  
  11.         std::cin >> perf;  
  12.   
  13.         if (perf == -1)  
  14.             break;  
  15.   
  16.         ins = perf*0.12;  
  17.         sal = 50 + ins;  
  18.   
  19.         std::cout << "your salary : " << sal * 10000 << std::endl;  
  20.     }  
  21.     return 0;  
  22. }  


'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
2. C++ 기본(2)  (0) 2016.12.09

+ Recent posts