함수 오버로딩

Jaemyeong Lee·2024년 8월 9일
0

FastCampusC++

목록 보기
44/78

함수 오버로딩에 대한 예제 코드 분석

함수 오버로딩은 C++의 중요한 기능 중 하나로, 같은 이름의 함수가 매개변수의 타입이나 개수에 따라 다르게 동작하도록 할 수 있습니다. 이를 통해 함수 이름의 일관성을 유지하면서도 다양한 상황에 대응할 수 있습니다. 이번 포스트에서는 함수 오버로딩의 개념을 이해하기 위해 예제 코드를 한 줄씩 분석하고, 그 의미를 자세히 설명하겠습니다.

1. 함수 countDigit의 정수형 입력에 대한 오버로딩

int countDigit(int num)
{
    if (num == 0)
        return 1;

    int count = 0;
    while (num)
    {
        num /= 10;
        ++count;
    }
    return count;
}
  • int countDigit(int num) 함수: 이 함수는 정수형 num을 입력받아 그 숫자가 몇 자리인지를 계산합니다. 예를 들어, 12345가 입력되면 이 함수는 5를 반환합니다.
    • if (num == 0) return 1;: 숫자가 0이면 자리수는 1로 반환됩니다.
    • while (num): 숫자가 0이 될 때까지 루프를 돌며 자릿수를 셉니다.
    • num /= 10;: 숫자를 10으로 나누어 마지막 자릿수를 제거합니다.
    • ++count;: 자릿수를 셀 때마다 count를 증가시킵니다.
    • return count;: 최종적으로 계산된 자릿수를 반환합니다.

2. 함수 countDigit의 문자열형 입력에 대한 오버로딩

int countDigit(string num)
{
    return countDigit(stoi(num));
}
  • int countDigit(string num) 함수: 이 함수는 문자열을 입력받아 int로 변환한 후, 위에서 정의한 countDigit(int) 함수를 호출합니다.
    • stoi(num): 문자열 num을 정수로 변환합니다.
    • return countDigit(stoi(num));: 변환된 정수를 매개변수로 전달하여 자릿수를 계산한 결과를 반환합니다.

이 함수는 입력이 문자열일 경우에도 자릿수를 쉽게 계산할 수 있도록 오버로딩된 것입니다.

3. 반환형만 다르게 오버로딩 불가

// string countDigit(int num)  반환형식으로는 함수 오버로딩이 안 됨
//{
//    
//}
  • 주석: C++에서 함수 오버로딩은 매개변수의 타입이나 개수에 따라 구분되기 때문에, 반환형만 다르게 해서 오버로딩할 수 없습니다. 동일한 매개변수 타입으로 두 함수를 정의할 수 없다는 의미입니다.

4. 네임 맹글링 및 정적 바인딩

// 컴파일 시 함수 이름을 바꾼다. name decoration, name mangling
// 컴파일 시 어떤 함수가 호출 되는지 결정이 된다. 정적 바인딩
void func(int, int); // func#int-int
void func(char); // func#char
  • 네임 맹글링(Name Mangling): C++에서는 함수 이름을 오버로딩할 수 있도록, 컴파일 시 함수 이름을 매개변수 타입에 따라 고유하게 변경합니다. 이를 네임 맹글링이라고 합니다. 예를 들어, func(int, int)func(char)는 각각 다른 이름으로 변환됩니다.
  • 정적 바인딩(Static Binding): C++ 컴파일러는 코드가 컴파일될 때 어떤 함수가 호출될지를 결정합니다. 이를 정적 바인딩이라고 합니다. 즉, 런타임이 아니라 컴파일 시점에 함수 호출이 결정됩니다.

5. main 함수에서의 오버로딩 예제

int main()
{
    cout << countDigit(12345) << endl;
    cout << countDigit("12345") << endl;

    // operator<< 라는 함수가 매개변수에 따라(char 또는 int) 오버로딩이 되어있다.
    cout << 'a' << endl;
    cout << (int)'a' << endl;
}
  • cout << countDigit(12345) << endl;: 정수형 입력을 받는 countDigit(int) 함수가 호출되어 12345의 자릿수인 5를 출력합니다.
  • cout << countDigit("12345") << endl;: 문자열형 입력을 받는 countDigit(string) 함수가 호출되어 12345의 자릿수인 5를 출력합니다.
  • cout << 'a' << endl;: operator<<char 타입에 대해 오버로딩되어 있으므로, 문자 'a'가 출력됩니다.
  • cout << (int)'a' << endl;: (int) 캐스팅을 통해 'a'의 ASCII 값인 97이 출력됩니다. 이는 operator<<int 타입에 대해 오버로딩되어 있기 때문입니다.

함수 오버로딩에 대한 요약

  • 함수 오버로딩(Function Overloading): 동일한 함수 이름을 사용하면서, 매개변수의 타입이나 개수를 다르게 하여 여러 함수를 정의할 수 있는 기능입니다. 이를 통해 함수 이름을 일관성 있게 유지하면서도 다양한 입력 타입에 대해 다르게 처리할 수 있습니다.
  • 네임 맹글링: 컴파일 시 함수 이름을 고유하게 변경하여, 함수 오버로딩이 가능하도록 합니다.
  • 정적 바인딩: 컴파일러가 컴파일 시점에 호출할 함수를 결정합니다.
  • 반환형만 다르게 오버로딩할 수 없음: 함수의 매개변수 타입이나 개수가 다르지 않고, 반환형만 다른 경우 함수 오버로딩이 불가능합니다.
profile
李家네_공부방

0개의 댓글