티스토리 뷰
주의 사항!
- 이 글은 제가 직접 공부하는 중에 작성되고 있습니다.
- 따라서 제가 이해하는 그대로의 내용이 포함됩니다.
- 따라서 이 글은 사실과는 다른 내용이 포함될 수 있습니다.
C언어에서는 다음과 같이 동일한 이름의 함수가 정의되는 것을 허용하지 않습니다. 두 함수의 이름이 같기 때문에 컴파일 오류가 발생합니다.
int myFunc(int num)
{
num++;
return num;
}
int myFunc(int a, int b)
{
return a+b;
}
그런데 C++에서는 위처럼 두 함수를 정의해도 무리가 없습니다. 다음 main 함수를 살펴보겠습니다.
int main(void)
{
myFunc(20); //muFunc(int num) 함수의 호출
myFunc(30, 40); //myFunc(int a, int b) 함수의 호출
return 0;
}
위의 주석에서 설명하듯이 함수 호출 시 전달되는 인자를 통해 호출하고자 하는 함수의 구분이 가능합니다. 따라서 매개변수가 다르다면 동일한 이름의 함수를 정의할 수 있습니다. 이러한 형태의 함수 정의를 가리켜 '함수 오버로딩'이라고 합니다.
그렇다면 C언어에서는 이것이 불가능했던 이유는 무엇일까요? 그 해답은 C언어와 C++가 호출할 함수를 찾는 방법이 다르기 때문입니다. C++는 함수를 찾을 때 함수명과 매개변수 두 가지를 비교하여 찾아냅니다. 하지만 C언어는 오로지 함수명으로만 비교하여 찾기 때문에 동일한 이름의 함수를 정의할 경우 두 함수를 구분하지 못합니다. 따라서 C언어는 함수 오버로딩이 불가능하며, 이를 문법적으로도 허용하지 않습니다.
함수의 오버로딩이 가능하려면 매개변수의 자료형이나 개수가 달라야 합니다. 만약 함수명과 매개변수의 자료형, 개수가 같은데 함수의 반환형이 다른 경우는 어떨까요?
double sum(int a, int b)
{
return (double)(a + b);
}
int sum(int a, int b) //에러 발생
{
return a + b;
}
이런 경우에는 함수 오버로딩이 불가능합니다. C++에서는 함수를 구분하는 기준으로 함수명, 매개변수의 자료형, 매개변수의 개수를 사용합니다. 함수의 반환형은 함수를 구분하는 기준에 속해 있지 않으므로 반환형만 다른 함수는 함수 오버로딩이 불가능합니다.
다음은 간단히 함수를 오버로딩하고 있는 예제입니다.
#include <iostream>
void myFunc(void)
{
std::cout << "myFunc(void) called\n";
}
void myFunc(char c)
{
std::cout << "myFunc(char c) called\n";
}
void myFunc(int a, int b)
{
std::cout << "myFunc(int a, int b) called\n";
}
int main(void)
{
myFunc();
myFunc('a');
myFunc(10, 20);
return 0;
}
/*
실행결과
myFunc(void) called
myFunc(char c) called
myFunc(int a, int b) called
*/
'공부 일지 > CPP 공부 일지' 카테고리의 다른 글
C++ | 새로운 자료형 bool (0) | 2021.07.31 |
---|---|
C++ | 네임스페이스(namespace) (0) | 2021.07.31 |
C++ | 인라인(inline) 함수 (0) | 2021.07.31 |
C++ | 매개변수의 디폴트 값 (0) | 2021.07.31 |
C++ | 표준 입출력과 출력 포맷 (0) | 2021.07.31 |