관리자 글쓰기
C++ 함수3
2022. 3. 26. 21:38 - pingu-s

함수의 중복

 

중복

 

지금까지 여러 가지 함수의 정의를 살펴보았다. 이들의 함수 내에는 실제적으로는 같은 처리를 하는 데도 불구하고, 1개의 함수에 종합되어 있지 않는 것도 있다.

예를 들면, 앞선 예제의 max() 함수를 생각하도록 한다. 이 max() 함수는 [2개의 int형의 값의 최댓값을 구한다.]는 처리를 하였다. 그러나 int형이 아니고, double형의 최댓값을 구하고 싶은 경우는 어떻게 하면 좋은가? 이 경우 double형의 인수를 가지는 함수를 새로 정의해야 한다. 즉, [최댓값을 구한다.]는 함수를 2개 준비해야 한다.

이와 같이, 실질적으로 같은 처리도 여러 개의 함수를 정의하지 않으면 안 되는 것이 있다. 단, 이때 C++에는 편리한 규칙이 있다. 이것은 인수의 형과 수가 다르면 같은 이름을 가지는 함수를 여러 개 정의할 수 있다는 것이다. 즉, [최댓값을 구하는 함수]로서 [max() 함수]를 2개 만들 수 있다.

 

int max(int x, int y);
double max(double x, double y);

이와 같이 인수의 수이 다른 같은 이름의 함수를 여러 개 정의하는 것을 함수의 중복(overloading)이라고 한다.

그러면, 함수의 중복에 관해 코드를 살펴보는 것으로 한다.

 

예제) 함수의 중복

정수와 실수에 대한 최댓값을 구하기 위해 max() 함수의 중복에 관한 코드를 작성해 보도록 한다.

#include <iostream>
using namespace std;

//max 함수의 선언
int max(int x, int y);
double max(double x, double y); //인수가 다른 2개의 max() 함수를 선언한다.

int main()
{
	int a, b;
	double da, db;

	cout << "2개의 정수를 입력하세요=> ";
	cin >> a >> b;

	cout << "2개의 소수를 입력하세요=> ";
	cin >> da >> db;

	int ans1 = max(a, b); //int형의 인수를 가지는 max() 함수가 호출된다.
	double ans2 = max(da, db); //double형의 인수를 가지는 max() 함수가 호출된다.

	cout << "정수값의 최댓값은 " << ans1 << "입니다.\n";
	cout << "소수값의 최댓값은 " << ans2 << "입니다.\n";

	return 0;
}

//max(int형) 함수의 정의
int max(int x, int y)
{
	if (x > y)
		return x;
	else
		return y;
}

//max(double형) 함수의 정의
double max(double x, double y)
{
	if (x > y)
		return x;
	else
		return y;
}

이 코드에서는 2종류의 max() 함수를 호출한다. 이때

1번째에 인수가 int형인 것
2번째에 인수가 double형인 것

인 max() 함수가 각각 올바르게 호출된다. 즉, 유사한 여러 개의 처리를 중복해 두면, 1개의 함수명을 기억해서 사용하는 것만으로 자동적으로 그 형과 개수에 대응한 처리가 수행된다는 것이다.

함수의 수가 증가해도 중복의 기능에 의해 알기 쉽게 이용하기 쉬운 코드를 기술할 수 있다.

 

중복에 관한 주의

 

최초에 설명한 것처럼 중복하는 함수는 인수의 형가 다르지 않으면 안 된다.

만약, 인수의 형과 수가 아주 똑같고, 반환값만이 다른 2개의 함수를 중복해버렸다면 어떻게 되는가?

 

int func(int a);
void func(int a);

그러면 다음과 같은 호출을 해도, 2개 중 어느 쪽의 함수를 호출할 것인지 판단할 수가 없다.

func(20); //어느 쪽의 함수를 호출해야 할 것인지 판단할 수 없다.

즉, 함수를 중복할 때에는 인수의 형 또는 개수를 다르게 해야 한다.

 

또한, 똑같은 이유로 디폴트 인수를 사용했을 때에도, 함수의 중복을 할 수 없는 경우가 있다. 예를 들면, 다음의 함수를 살펴보도록 한다.

int func(int a, int b = 0); //디폴트 인수를 사용하고 있다
int func(int a);

이때, 다음의 호출에 의해 어느 쪽의 함수를 호출할 것인가 판단할 수 없다.

func(20); //어느 쪽의 함수를 호출해야 할 것인지 판단할 수 없다.

중복할 때는 인수에 주의해야 한다.

 

템플릿 함수

 

C++에서는 함수의 "형틀(모형)"을 준비할 수 있다는 편리한 기능이 있다. 취급하는 형만이 다른 함수를 형틀로부터 작성할 수 있도록 되어 있다. 이 문형을 템플릿 함수(template function)라고 한다. 템플릿 함수를 이용하려면 다음과 같은 순서가 필요하다.

 

          ① 템플릿 함수를 선언 및 정의한다.

          ② 함수를 호출한다(함수가 자동적으로 생성된다).

 

우선은 처음에 템플릿 함수를 선언 및 정의하는 방법을 살펴보기로 한다.

 

템플릿 함수의 정의

 

템플릿 함수의 선언 및 정의는 다음과 같이 기술한다.

 

[구문 : 템플릿 함수의 선언 및 정의]

template <class 템플릿 인수의 리스트>
함수의 선언 또는 정의

템플릿 함수는 통상의 함수 선언, 또는 정의에 template<...>이라는 지정을 붙인 것이다. <...>의 부분에는 템플릿 인수를 지정한다.

템플릿 인수는 T 등의 임시 형명을 지정한 것이다. 템플릿 함수에서는 가인수의 형명에 템플릿 인수를 사용한다. 구체적인 형명 대신에 T 등의 임시 형명을 사용한 것이다.

 

다음의 코드가 템플릿 함수의 정의이다.

//템플릿 함수
template <class T> //T등 임시 형명으로 기술한다.
T maxt(T x, T y) //구체적인 형명 대신에 T를 임시 형명으로 한다.
{
	if (x > y)
		return x;
	else
		return y;
}

 

템플릿 함수의 이용

 

템플릿 함수를 이용하려면 통상의 함수 호출과 같이 호출한다. 템플릿 함수의 호출을 기술하면 코드를 컴파일할 때에 템플릿 인수 T를 지정한 형으로 바꾼 함수가 작성된다. 즉, 코드에서 템플릿 함수를 호출함으로써 구체적인 형을 취급하는 함수가 호출되는 것이다.

그러면 템플릿 함수를 사용해서 앞선 예제와 같이 처리를 수행하는 코드를 작성해 보도록 한다.

 

예제) 템플릿 함수

템플릿 함수를 사용해서 최댓값을 구하는 코드를 작성해 보도록 한다.

#include <iostream>
using namespace std;

template <class T> //템플릿 함수의 선언에서 임시 형명으로 기술한다.
T maxt(T x, T y) //템플릿 인수를 가지는 템플릿 함수를 정의한다.
{
	if (x > y)
		return x;
	else
		return y;
}

int main()
{
	int a, b;
	double da, db;

	cout << "2개의 정수를 입력하세요=> ";
	cin >> a >> b;

	cout << "2개의 소수를 입력하세요=> ";
	cin >> da >> db;

	int ans1 = maxt(a, b); //템플릿 인수를 int형으로 바꾸어 놓은 함수가 호출된다. 따라서 int형의 값을 넘겨서 템플릿 함수를 호출한다.
	double ans2 = maxt(da, db); //다음에 double형의 값을 넘기고 한 번 더 템플릿 함수를 호출한다.

	cout << "정수값의 최댓값은 " << ans1 << "입니다.\n";
	cout << "소수값의 최댓값은 " << ans2 << "입니다.\n";

	return 0;
}

이와 같은 호출에 의해 템플릿 인수 T를 int형, double형으로 바꾼 함수가 작성된다. 그리고 코드를 실행할 때에는 지정한 형의 함수가 호출된다.

 

템플릿 함수는 취급하는 형은 다르지만, 그 외에는 아주 똑같은 처리를 수행하는 함수에 의해 코드를 1개로 종합할 수 있는 편리한 기능을 가지고 있다. 앞선 두 개의 max() 함수는 형이외의 처리가 아주 똑같기 때문에, 이 템플릿 함수를 사용할 수 있다.

 

 

출처: 박흥복서정희. 2015. C++ 프로그래밍 (초보자를 위한). 문운당

'개발 > C++' 카테고리의 다른 글

C++ 포인터2  (0) 2022.03.30
C++ 포인터  (0) 2022.03.27
C++ 함수2  (0) 2022.03.21
C++ 함수  (0) 2022.03.17
C++ 반복문2  (0) 2022.03.16