C언어와 달리 C++에서는 함수의 인자(parameter) 타입이나 개수가 다르면 동일한 이름의 함수를 여러 개 만들 수 있다. 이를 함수 오버로딩이라 한다.
int func(int param1);
int func(char param1);
int func(int param1, int param2);
[ C언어 ] - 컴파일 실패
main.c:2:5: error: conflicting types for 'func'
int func(char param1);
^
main.c:1:5: note: previous declaration is here
int func(int param1);
^
main.c:3:5: error: conflicting types for 'func'
int func(int param1, int param2);
^
main.c:1:5: note: previous declaration is here
int func(int param1);
^
2 errors generated.
[ C++ ] - 컴파일 성공
예를 들어, 어떤 두 값의 합을 구하는 기능은 int
타입끼리의 더하기도 가능하지만 double
타입끼리의 더하기도 가능하다. C언어에서는 각 함수가 다 다른 이름을 가져야 하지만 C++에서는 기능에 집중하여 동일한 함수 이름을 사용할 수 있어 사용자의 입장에서 더 편하다. 두 값을 더해주는 기능의 함수가 "add
"라는 이름을 갖는다는 것만 안다면 더하고자 하는 숫자의 타입에 관계없이 "add
" 함수만 사용하면 되기 때문이다.
[ C언어 ]
int add_int(int a, int b)
{
return a + b;
}
double add_double(double a, double b)
{
return a + b;
}
int main(void)
{
add_int(3, 4);
add_double(3.14, 2.51);
}
[ C++ ]
int add(int a, int b) // 1)
{
return a + b;
}
double add(double a, double b) // 2)
{
return a + b;
}
int main(void)
{
add(3, 4); // call 1)
add(3.14, 2.51); // call 2)
}
단, 리턴 타입만이 다를 때에는 함수 오버로딩이 되지 않는다. 그 이유는 컴파일러가 인자를 보고 호출할 함수를 판단하기 때문이다. (리턴 타입만이 다를 때에는 컴파일러 입장에서 어떤 함수를 호출할지 모른다)
int func(int param1);
double func(int param1);
main.cpp:2:9: error: functions that differ only in their return type cannot be overloaded
double func(int param1);
~~~~~~ ^
main.cpp:1:6: note: previous declaration is here
int func(int param1);
~~~ ^
1 error generated.
비슷하게 default argument로만 차이를 주었을 때에도 함수 오버로딩은 되지 않는다.
int func(int param1);
int func(int param1, int param2 = 0);
int main(void)
{
func(0);
}
main.cpp:6:2: error: call to 'func' is ambiguous
func(0);
^~~~
main.cpp:1:5: note: candidate function
int func(int param1);
^
main.cpp:2:5: note: candidate function
int func(int param1, int param2 = 0);
^
1 error generated.
정리하자면, 결국 컴파일러가 어떤 함수를 호출할지 모르는 상황이 발생하게 되면 함수 오버로딩이 되지 않는다는 것을 알 수 있다.
'C · C++' 카테고리의 다른 글
[C++] 복사 생성자 (Copy Constructor) (0) | 2023.01.15 |
---|---|
[C++] 템플릿(Template) 함수 (0) | 2022.07.27 |
[C++] Default Arguments (Parameters) (0) | 2022.07.16 |
[C++] 함수의 선언과 구현부 분리 (0) | 2022.07.13 |
[C++] 생성자와 초기화 리스트 (Initializer List) (0) | 2022.05.26 |