C++에서 함수는 입력 인자의 자료형에 제약이 있습니다.
예를 들어 정수형 2개를 입력받고 두 값을 더한 정수를 반환하는 함수에 double형 값을 입력하면 문제가 발생합니다.
하지만 비슷한 또는 동일한 기능을 하고, 다양한 자료형을 모두 처리할 수 있는 함수가 필요할 때도 있습니다.
이럴 때 우리는 함수 오버로딩을 사용합니다.
쉽게 설명하자면, 같은 이름을 가졌지만 다른 자료형을 처리하는 함수입니다.
입력 인자의 자료형이 다르다는 뜻입니다.
* 함수의 반환 자료형은 상관 없습니다. 입력 인자의 자료형만 고려합니다.
간단한 예시를 보겠습니다.
// Overloading Function
#include <iostream>
using namespace std;
int add_num(int, int);
double add_num(double, double);
int main() {
cout << "add_num with 2 integers: " << add_num(10.3, 100.44) << endl;
cout << "add_num with 2 doubles: " << add_num(10, 30) << endl;
}
int add_num(int a, int b) { return a + b; }
double add_num(double a, double b) { return a + b; }
동일한 이름 add_num 으로 선언된 동일한 기능을 하는 두개의 함수가 존재합니다.
유일한 차이점은 입력 인자의 자료형과 반환값의 자료형입니다.
하지만 위에서 설명했듯, 반환값의 자료형은 의무적이진 않습니다.
정수형을 처리하는 add_num 역시 double의 값을 반환하거나, double 값을 처리하는 함수도 정수 값으로 반환해도 문제는 없습니다.
하지만 우리가 원하던 결과는 아니겠죠?
다음 예시는 조금 더 다양한 자료형을 다룹니다.
파이썬의 print() 함수를 C++에서 구현해보는 코드입니다.
// Function Overloading
#include <iostream>
#include <string>
#include <vector>
using namespace std;
void print(int);
void print(double);
void print(string);
void print(string, string);
void print(vector<string>);
void print(int num) {
cout << "Printing int: " << num << endl;
}
void print(double num) {
cout << "Printing double: " << num << endl;
}
void print(string s) {
cout << "Printing string: " << s << endl;
}
void print(string s, string t) {
cout << "Printing 2 strings: " << s << " and " << t << endl;
}
void print(vector<string> v) {
cout << "Printing vector of strings: " ;
for (auto s: v )
cout << s + " ";
cout << endl;
}
int main() {
print(100); // int
print('A'); // character is always promoted to int should print 65 ASCII ('A')
print(123.5); // double
print(123.3F); // Float is promoted to double
print("C-style string"); // C-style string is converted to a C++ string
string s {"C++ string"};
print(s); // C++ string
print("C-style string", s); // First argument is converted to a C++ string
vector<string> three_stooges {"Larry", "Moe", "Curly"};
print(three_stooges);
cout << endl;
return 0;
}
위 예시와 동일하게 같은 이름 print 를 지닌 함수들이 여러개 선언되었고,
각각 다른 자료 인자를 받아서 해당 인자에 대한 출력을 한 것을 볼 수 있습니다.
int 자료형을 출력하는 함수에 문자열 벡터를 출력하게 하면 오류가 발생하겠죠?
하지만 결국 (거의) 동일한 기능을 행하는 함수들이기 때문에, 같은 이름으로 다른 인자에 대해 여러개를 선언합니다.
이것이 function overloading 입니다.
'C++ > 함수 (Function)' 카테고리의 다른 글
[C++] 함수에서 포인터를 반환하기 (Returning a Pointer from a Function) (1) | 2023.12.22 |
---|---|
[C++] 재귀 함수 (Recursive Function) (0) | 2023.12.18 |
[C++] 참조로 전달하기 (Pass by Reference) (1) | 2023.12.17 |
[C++] 함수에 배열을 매개변수로 사용할 때 (Passing Arrays To Functions) (3) | 2023.12.17 |
[C++] 함수 프로토타입 (Function Prototype) & 디폴트 매개 변수 (Default Argument Values) (0) | 2023.12.16 |