뚜둔뚜둔✩

판다의 개발일지

C · C++

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

2022. 7. 23. 23:04

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++] Default Arguments (Parameters)

C++에서는 C 언어에서와 달리 default argument를 설정해두면 함수 호출 때 인자를 전달하지 않아도 함수를 호출할 수 있다. #include int add(int a = 123, int b = 321) { return a + b; } int main(void) { std..

pandas-are-bears.tistory.com