함수 오버로딩(Function Overloading)
C언어에서는 다음과 같이 동일한 이름의 함수가 정의되는 것을 허용하지 않는다.
두 함수의 이름이 같기 때문에 컴파일 오류가 발생한다.
- int func(int num){
- num++;
- return num;
- }
- int func(int a, int b){
- return a + b;
- }
C++에서는 함수호출 시 전달되는 인자를 통해서 호출하고자 하는 함수의 구분이 가능하다.
즉 매개변수의 형태가 다르다면 동일한 이름의 함수를 정의할 수 있다 이를 함수 오버로딩 이라 한다.
그렇다면? C언어가 함수 오버로딩을 허용하지 않는 이유는 무엇일까?
호출하는 함수를 찾는 방법이 서로 다르기 때문이다.
C |
C++ |
함수 이름 |
함수의 이름, 매개변수의 선언 |
C++는 함수의 이름과 매개변수 두가지 정보를 활용하지만
C언어는 함수의 이름만을 이용하여 호출 대상을 찾는다.
따라서 C언어에서는 함수의 오버로딩이 불가능하다.
예제
- #include <iostream>
- using namespace std;
- void func(void) {
- cout << "func(void) called" << endl;
- }
- void func(char c) {
- cout << "func(char c) called" << endl;
- }
- void func(int a, int b) {
- cout << "func(int a, int b) called" << endl;
- }
- int main() {
- func();
- func('A');
- func(12, 13);
- return 0;
- }
예제 결과
문제 : 다음 main( )함수에서 필요로 하는 swap 함수를 오버로딩 해서 구현해보자
- #include <iostream>
- using namespace std;
- int main(void) {
- int num1 = 20, num2 = 30;
- swap(&num1, &num2);
- cout << num1 << ' ' << num2 << endl;
- char ch1 = 'A', ch2 = 'Z';
- swap(&ch1, &ch2);
- cout << ch1 << ' ' << ch2 << endl;
- double dbl1 = 1.1111, dbl2 = 5.5555;
- swap(&dbl1, &dbl2);
- cout << dbl1 << ' ' << dbl2 << endl;
- return 0;
- }
답
- void swap(int *a, int *b){
- int tmp = *a;
- *a = *b;
- *b = tmp;
- }
- void swap(char *a, char*b) {
- char tmp = *a;
- *a = *b;
- *b = tmp;
- }
- void swap(double *a, double *b) {
- double tmp = *a;
- *a = *b;
- *b = tmp;
- }
매개변수의 디폴트 값 (Default Value)
C++에서는 매개변수를 다음의 형태로 선언하는 것이 가능하다.
- int func1(int num = 7) {
- return num + 1;
- }
- int func2(int num1 = 5, int num2 = 7) {
- return num1 + num2;
- }
- 함수호출 시 인자를 전달하지 않으면 7이 전달된 것으로 간주한다.
- 함수호출 시 인자를 전달하지 않으면 5와 7이 전달된 것으로 간주한다.
- #include <iostream>
- using namespace std;
- int addr(int num1 = 1, int num2 = 2) {
- return num1 + num2;
- }
- int main() {
- cout << addr() << endl;
- cout << addr(5) << endl;
- cout << addr(3, 5) << endl;
- return 0;
- }
예제 결과
주의할 점
유효 |
유효하지 않음 |
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
- #include <iostream>
- using namespace std;
- int bvm(int len, int wd = 1, int hei = 1) {
- return len * wd * hei;
- }
- int main() {
- cout << "[3,3,3] : " << bvm(3, 3, 3) << endl;
- cout << "[5,5,D] : " << bvm(5, 5) << endl;
- cout << "[7,D,D] : " << bvm(7) << endl;
- cout << "[D,D,D] : " << bvm() << endl;
- return 0;
- }
- 첫 번째 매개변수에는 디폴트 값이 지정되어 있지 않다.
- bvm함수를 호출할 때에는 반드시 하나 이상의 인자를 전달해야 한다.
- 12행에서 인자를 전달하지 않았기 때문에 컴파일 에러가 발생한다.
- int test(int a = 10){
- return a + 1;
- }
- int test(void){
- return 10;
- }
- #include <iostream>
- using namespace std;
- int bvm(int len = 1) {
- return len;
- }
- int bvm(int len, int wid) {
- return len*wid;
- }
- int bvm(int len, int wid, int hei) {
- return len*wid*hei;
- }
- int main() {
- cout << "[3,3,3] : " << bvm(3, 3, 3) << endl;
- cout << "[5,5,D] : " << bvm(5, 5) << endl;
- cout << "[7,D,D] : " << bvm(7) << endl;
- cout << "[D,D,D] : " << bvm() << endl;
- return 0;
- }
문제 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 |