Channi Studies

[C++] 함수 오버로딩 (Function Overloading) 본문

C++/함수 (Function)

[C++] 함수 오버로딩 (Function Overloading)

Chan Lee 2023. 12. 17. 22:22

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;
}

실행 결과2

 

위 예시와 동일하게 같은 이름 print 를 지닌 함수들이 여러개 선언되었고,

각각 다른 자료 인자를 받아서 해당 인자에 대한 출력을 한 것을 볼 수 있습니다.

int 자료형을 출력하는 함수에 문자열 벡터를 출력하게 하면 오류가 발생하겠죠?

하지만 결국 (거의) 동일한 기능을 행하는 함수들이기 때문에, 같은 이름으로 다른 인자에 대해 여러개를 선언합니다.

 

이것이 function overloading 입니다.