티스토리 뷰

C++

01-2 함수 오버로딩(Function Overloading)

HyunSang Park 2020. 11. 21. 14:28

함수는 매우 중요한 위치를 차지하고 있습니다. 그런데 이렇게나 중요한 기능이 C++로 옮겨지면서 일부 확장되었습니다.

함수 오버로딩의 이해

C언어에서는 다음과 같이 동일한 이름의 함수가 정의도는 것을 허용하지 않습니다.

두 함수의 이름이 같기 때문에 컴파일 오류가 발생하게 됩니다.

int MyFunc(int num) {
    num++;
    return num;
}

int MyFunc(int a, int b) {
    return a+b;
}

그런데 위의 두 함수정의를 허용해도 별 무리가 없을 거라는 생각이 들게 됩니다.

가장 많이 사용하는 main 함수릉 이용하여서 이야기를 이어가겠습니다.

int main(void) {
    MyFunc(20); // MyFunc(int num) 함수의 호출
    MyFunc(30, 40); // MyFunc(int a, int b) 함수의 호출
    return 0;
}

위의 main 함수에 삽입된 주석에서 설명하고 있듯이 함수호출 시 전달되는 인자를 통해서 호출하고자 하는 함수의 구분이 가능하기 때문에 매개변수의 선언형태가 다르다면, 동일한 이름의 함수정의를 허용할 수 있다는 생각이 듭니다. 그런데 실제로 C++은 이를 허용하고 있으며, 이러한 형태의 함수정의를 가리켜서 '함수 오버로딩(Function Overloading)'이라고 합니다.

그렇다면 C++은 '함수 오버로딩'을 허용하는데, C언어에서는 허용하지 않는 이유는 무엇일까요?

이는 호출할 함수를 찾는 방법이 두 언어 간 다르기 때문입니다. C++은 호출할 함수를 찾을 때, 다음과 같은 두 가지 정보를 동시에 활용합니다.

'함수의 이름', '매개변수의 선언'

다음 의 함수 호출문을 보면

MyFunc(30, 40);

위 코드를 다음과 같이 판단하고 함수를 찾게 됩니다.

"두 개의 int형 정수를 인자로 전달받을 수 있는 MyFunc라는 이름의 함수를 찾아야겠군!"

반면 C언어의 경우에는 함수의 이름만을 가지고 호출 대상을 찾기 때문에 위의 함수 호출문을 보면서 다음과 같이 판단하고 함수를 찾게 됩니다.

"MyFunc 어디있어? MyFunc!!"

때문에 C언어에서는 함수의 오버로딩이 불가능하며, 이를 문법적으로 허용하지도 않습니다.

함수 오버로딩의 예

함수의 오버로딩이 가능하려면 매개변수의 선언이 달라야 한다. 예를 들어서 다음 두 함수는 오버로딩이 가능합니다.

int MyFunc(char c) {....}
int MyFunc(int n) {....}

매개변수의 자료형이 다르므로, 전달인자의 자료형을 통해서 호출할 함수의 구분이 가능하기 때문입니다.

마찬가지로 다음 두 함수도 오버로딩이 가능합니다.

int MyFunc(int n) {....}
int MyFunc(int n1, int n2) {....}

이 경우는 매개변수의 개수가 다르므로, 전달되는 인자의 개수를 통해서 호출할 함수의 구분이 가능하기 때문입니다.

정리하게 되면 함수의 오버로딩이 가능하려면 다음과 같은 조건을 만족해야 합니다.

"매개변수의 자료형 또는 개수가 다르다."

반면 다음은 대표적인, 잘못된 함수 오버로딩의 예를 소개해 드리겠습니다.

void MyFunc(int n) {....}
int MyFunc(int n) {....}

위의 두 함수는 반환형이 다릅니다. 하지만 반환형은 함수호출 시, 호출되는 함수를 구분하는 기준이 될 수 없습니다.

따라서 위와 같은 형태의 함수정의는 컴파일 오류로 이어지게 됩니다.

그럼 간단히 함수를 오버로딩하고 있는 예제를 소개하겠습니다.

#include <iostream>

void MyFunc(void) {
    std::cout<<"MyFunc(void) Called"<<std::endl;
}

void MyFunc(char c) {
    std::cout<<"MyFunc(char c) called"<<std::endl;
}

void MyFunc(int a, int b) {
    std::cout<<"MyFunc(int a, int b) called"<<std::endl;
}

int main(void) {
    MyFunc();
    MyFunc('A');
    MyFunc(12, 13);
    return 0;
}
  • 20행 : 3행의 함수를 호출하는 문장이다.
  • 21행 : 8행의 함수를 호출하는 문장이다.
  • 22행 : 13행의 함수를 호출하는 문장이다. 

이렇듯 함수 오버로딩은 어려운 개념이 아닙니다. 오히려 우리가 생각해도 타당하게 느껴질 만큼 매우 자연스러운 개념입니다.

'C++' 카테고리의 다른 글

01-2 함수 오버로딩(Function Overloading)  (0) 2020.11.21
01-1. printf와 scanf를 대신하는 입출력 방식  (0) 2020.11.18
댓글
댓글쓰기 폼