정수 두 개를 더하는 함수와 실수 두 개를 더하는 함수를 정의할 때 함수 이름, 매개 변수의 자료형, 함수의 반환 형을 규정하여야 한다.
더한다는 의미를 가지는 함수의 이름으로 add()
를 사용할 것이다.
C
언어에서는 함수를 구별할 때 함수 이름 만을 사용하기 때문에 정수 두 개를 더하는 함수와 실수 두 개를 더하는 함수를 add()
라는 동일한 이름으로 정의할 수 없었으나 C++
에서는 동일한 이름 공간에서 이름이 같은 함수를 둘 이상 정의할 수 있다.
이 것이 가능한 이유는 C++
에서 함수의 구별을 C
와 달리 함수 이름, 매개 변수의 자료형, 매개 변수의 수에 따라 이루어진다.
이러한 함수들을 중복된(overloaded) 함수라 하고 매개 변수의 자료형 또는 매개 변수의 수에 따라 함수가 의미는 같으나 다른 기능을 가진다.
정수 두 개와 실 수 두 개의 더하는 함수 add()
함수를 다음과 같이 만들 수 있다.
int add(int a, int b); // 정수 두 개를 입력 받은 후 더한 정수 값을 반환하는 함수
double add(double a, double b); // 실수 두 개를 입력 받은 후 더한 실수 값을 반환하는 함수
함수 중복 개념은 매개 변수의 자료형과 개수가 다르면 같은 이름을 가진 함수를 여러 개 정의할 수 있도록 한다. 함수 중복의 함수는 매개 변수의 자료형과 개수가 기존에 정의된 함수와 달라야 하며 리턴 자료형은 함수를 구별하는데 사용되지 않는다. 즉 리턴 자료형만 다른 두 개의 함수는 중복할 수 없다.
함수 중복은 다형성의 한 예로 전역 함수와 클래스의 멤버 함수에 모두 적용이 된다.
함수 중복이 가능하기 위해서는 아래의 조건이 만족되어야 한다.
- 중복된 함수들의 이름이 동일하다.
- 중복된 함수들은 매개 변수의 자료형 또는 개수가 달라야 한다.
다음은 함수 중복의 예이다.
#include <iostream>
using namespace std;
int add(int a, int b);
double add(double a, double b);
int main(int argc, char const *argv[])
{
cout << add(10, 20) << endl; // int add(int a, int b) 호출
cout << add(5.3, 20.6) << endl; // double add(double a, double b) 호출
cout << add(10, 15.7) << endl; // error: call to 'add' is ambigious
return 0;
}
int add(int a, int b){
cout << "int add()" << endl;
return a + b;
}
double add(double a, double b) {
cout << "double add()" << endl;
return a + b;
}
main()
함수에서 add()
함수 호출이 세 번 있는데 첫 번쨰 함수 호출인
add(10, 20);
의 경우 매개 변수가 10
과 20
으로 정수 값이므로
int add(int a, int b)
함수가 호출되고 두 번쨰 함수 호출인
add(5.3, 20.6);
의 경우 매개 변수가 5.3
과 20.6
으로 모두 실수 값이므로
double add(double a, double b)
함수가 호출된다.
세 번째 함수 호출인
add(10, 15.7);
는 매개 변수가 하나는 정수이고 다른 하나는 실수로 호출되는데 이러한 매개 변수 자료형을 가진 함수가 정의되지 않아 주석과 같이 어떠한 add()
함수를 실행시켜야 하는지 결정하지 못하여 에러가 발생한다.
세 번째 함수 호출을 주석으로 처리한 후 프로그램의 실행 결과는 다음과 같다.
int add()
30
double add()
25.9
#include <iostream>
using namespace std;
int sum(int a, int b){
return a + b;
}
double sum(int a, int b){
return (double)(a + b);
}
int main(int argc, char const *argv[])
{
cout << add(10, 20) << endl;
return 0;
}
앞의 프로그램을 컴파일하면 두번 째 함수의 정의 부분에서 에러가 발생한다. 에러는 두번 쨰 함수
double sum(int a, int b)
의 정의가 첫번 째 함수
int sum(int a, int b)
와 구별되지 않아 발생한다.
함수 중복은 매개 변수의 자료형이 다른 경우 함수 이름을 다르게 하고 자료형에 따른 함수 이름을 기억하여야 하는 문제를 해결한다. 함수 중복을 활용하여 프로그램을 작성하면 C++ 컴파일러는 함수 중복과 함수의 호출이 맞는지 검증한다. 중복 정의된 함수와 함수 호출과의 바인딩이 컴파일 시점이 이루어지기 때문에 실행 시간에 영향을 미치지 않는다.
함수 중복 개념은 클래스의 생성자를 중복 선언할 때 사용된다.