Skip to content

Latest commit

 

History

History
105 lines (76 loc) · 4.55 KB

overload.md

File metadata and controls

105 lines (76 loc) · 4.55 KB

함수 중복(Function Overloading)

정수 두 개를 더하는 함수와 실수 두 개를 더하는 함수를 정의할 때 함수 이름, 매개 변수의 자료형, 함수의 반환 형을 규정하여야 한다. 더한다는 의미를 가지는 함수의 이름으로 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);의 경우 매개 변수가 1020으로 정수 값이므로

int add(int a, int b) 함수가 호출되고 두 번쨰 함수 호출인 add(5.3, 20.6);의 경우 매개 변수가 5.320.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++ 컴파일러는 함수 중복과 함수의 호출이 맞는지 검증한다. 중복 정의된 함수와 함수 호출과의 바인딩이 컴파일 시점이 이루어지기 때문에 실행 시간에 영향을 미치지 않는다.

함수 중복 개념은 클래스의 생성자를 중복 선언할 때 사용된다.