도순씨의 코딩일지

C++ :: 함수 오버로딩(Function Overloading) & 매개변수의 디폴트값(Default Value) 본문

𝐏𝐑𝐎𝐆𝐑𝐀𝐌𝐌𝐈𝐍𝐆/𝐂++

C++ :: 함수 오버로딩(Function Overloading) & 매개변수의 디폴트값(Default Value)

도순씨 2020. 7. 22. 01:22

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

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

함수의 다형성을 위해서 다양한 매개변수를 이용할 수 있도록 C++에서는 동일한 이름의 함수가 정의되는 것을 허용한다.

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

 

함수 오버로딩 코드 예제는 다음과 같다.

 

@ 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#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

 

@ 실행 결과

1
2
3
MyFunc(void) called
MyFunc(char c) called
MyFunc(int a, int b) called
cs

 

함수 오버로딩과 관련된 예제를 해결해보도록 하자.

다음 main 함수에서 필요로 하는 swap 함수를 오버로딩 해서 구현해보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main(void){
    int num1 = 20, num2 = 30;
    swap(&num1, &num2);
    std::cout<<num1<<' ' <<num2<<std::endl;
    
    char ch1 = 'A', ch2 = 'Z';
    swap(&ch1, &ch2);
    std::cout<<ch1<<' '<<ch2<<std::endl;
    
    double dbl1 = 1.111, dbl2 = 5.555;
    swap(&dbl1, &dbl2);
    std::cout<<dbl1<<' '<<dbl2<<std::endl;
}
 
cs
더보기
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
26
27
28
29
30
31
32
33
34
#include <iostream>
 
void swap(int *num1, int *num2){
    int temp = *num1;
    *num1 = *num2;
    *num2 = temp;
}
 
void swap(char *ch1, char *ch2){
    char temp = *ch1;
    *ch1 = *ch2;
    *ch2 = temp;
}
 
void swap(double *dbl1, double *dbl2){
    double temp = *dbl1;
    *dbl1 = *dbl2;
    *dbl2 = temp;
}
 
int main(void){
    int num1 = 20, num2 = 30;
    swap(&num1, &num2);
    std::cout<<num1<<' ' <<num2<<std::endl;
    
    char ch1 = 'A', ch2 = 'Z';
    swap(&ch1, &ch2);
    std::cout<<ch1<<' '<<ch2<<std::endl;
    
    double dbl1 = 1.111, dbl2 = 5.555;
    swap(&dbl1, &dbl2);
    std::cout<<dbl1<<' '<<dbl2<<std::endl;
}
 
cs

 

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

매개변수는 void swap(int num1, int num2)에서 num1, num2와 같이 함수와 함께 전달되는 값을 의미한다.

C언어에서는 매개변수의 디폴트 값(지정된 값)을 정하는 것이 불가능하다. C++은 디폴트값을 지정하는 것이 가능하다.

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

\

만약에 num1 = 8; MyFuncOne(num1);과 같이 특정한 값을 전달하면 해당 값으로 매개변수가 설정되지만, 그렇지 않다면 7로 설정된다.

더 빠른 이해를 위해서 예제를 살펴보자.

 

@ 코드 

1
2
3
4
5
6
7
8
9
10
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(35)<<std::endl;
    return 0;
}
cs


@ 실행 결과

1
2
3
3
7
8
cs

 

Adder()에서는 num1 = 1, num2 = 2로 설정된다 따라서 출력값은 3이다.

Adder(5)에서는 num1 = 5, num2 = 2이다. 따라서 출력값은 7이다.

Adder(3, 5)에서 num1 = 3, numt2 = 5이다. 그러므로 출력값은 8이다.

 

함수의 원형을 별도로 선언하는 경우에는 함수 원형 선언에만 위치시켜도 된다.

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

디폴트 값 선언이 함수의 선언 부분에 위치해야 하는 이유는 예제 6행, 7행과 같이 디폴트 값을 사용하는 함수들을 컴파일하기 위해서이다.

모든 값이 아니라 부분적으로 디폴트값을 선언하는 것도 가능하다.
다음 코드를 살펴보도록 하자.

@ 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
 
int BoxVolume(int lenght, int width = 1int height = 1);
 
int main(void){
    std::cout<<"[3, 3, 3]: "<<BoxVolume(333)<<std::endl;
    std::cout<<"[5, 5, D]: "<<BoxVolume(55)<<std::endl;
    std::cout<<"[7, D, D]: "<<BoxVolume(7)<<std::endl;
    //std::cout<<"[D, D, D]: "<<BoxVolume()<<std::endl;
    return 0;
}
 
int BoxVolume(int length, int width, int height){
    return length * width * height;
}
cs

 

@ 실행 결과

1
2
3
[3, 3, 3]: 27
[5, 5, D]: 25
[7, D, D]: 7
cs

 

Default 값이 있는 자리는 그 값이 매개변수로 설정된 것을 볼 수 있다. 만약 하나만 매개변수에 작성했다면 가장 앞의 값이 그 값인 것을 알 수 있다.

std::cout<<"[D, D, D]: "<<BoxVolume()<<std::endl

 

위 코드는 디폴드값이 설정되지 않은 값도 매개변수로 전달하지 않았기 때문에 오류가 발생한다.

 

 

Comments