함수 오버로딩은 C++의 중요한 기능 중 하나로, 같은 이름의 함수가 매개변수의 타입이나 개수에 따라 다르게 동작하도록 할 수 있습니다. 이를 통해 함수 이름의 일관성을 유지하면서도 다양한 상황에 대응할 수 있습니다. 이번 포스트에서는 함수 오버로딩의 개념을 이해하기 위해 예제 코드를 한 줄씩 분석하고, 그 의미를 자세히 설명하겠습니다.
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;
: 최종적으로 계산된 자릿수를 반환합니다.countDigit
의 문자열형 입력에 대한 오버로딩int countDigit(string num)
{
return countDigit(stoi(num));
}
int countDigit(string num)
함수: 이 함수는 문자열을 입력받아 int
로 변환한 후, 위에서 정의한 countDigit(int)
함수를 호출합니다.stoi(num)
: 문자열 num
을 정수로 변환합니다.return countDigit(stoi(num));
: 변환된 정수를 매개변수로 전달하여 자릿수를 계산한 결과를 반환합니다.이 함수는 입력이 문자열일 경우에도 자릿수를 쉽게 계산할 수 있도록 오버로딩된 것입니다.
// string countDigit(int num) 반환형식으로는 함수 오버로딩이 안 됨
//{
//
//}
// 컴파일 시 함수 이름을 바꾼다. name decoration, name mangling
// 컴파일 시 어떤 함수가 호출 되는지 결정이 된다. 정적 바인딩
void func(int, int); // func#int-int
void func(char); // func#char
func(int, int)
와 func(char)
는 각각 다른 이름으로 변환됩니다.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
타입에 대해 오버로딩되어 있기 때문입니다.