본문 바로가기

Programming Languages/C++

[함수]-함수의 정의와 호출-함수 사용의 장점과 단점

#include <iostream>
using namespace std;
int main()
{
	double a[50], b[100];
	..... // 생략 - a와b에 각각 50개와 100개의 데이터 입력
	double sum = 0, sqSum = 0;
	for (int i = 0; i < 50; i++) {
		sum += a[i];
		sqSum += a[i] * a[i];
	}
	cout << sqSum / 50 - sum * sum / (50 * 50) << endl;
	sum = sqSum = 0;
	for (int i = 0; i < 100; i++) {
		sum += b[i];
		sqSum += b[i] * b[i];
	}
	cout << sqSum / 100 - sum * sum / (100 * 100) << endl;
	return 0;
}

위 프로그램이 어떠한 처리를 하는지 알아내려면 하나하나의 문장을 읽어보고 분석해야 한다. 위 프로그램은 배열에 저장된 값들의 분산을 구하는 비교적 간단한 작업이라 어렵지 않게 알아낼 수도 있겠지만, 처리하는 내용이 복잡할수록 분석하기가 어려워진다. 또한 위 코드에서 a,b에서 데이터 수가 각각 50개와 100개라는 점을 제외하면 동일한 처리를 하고 있어 문장이 중복되어 있다. 이러한 점들은 프로그램을 수정하거나 개선하는 등 유지보수 단계에서 복잡도를 높이는 요인이 된다.

#include <iostream>
using namespace std;
double variance(const double arr[], int size); // 함수 원형 선언

int main()
{
	double a[50], b[100];
	..... // 생략 - a와b에 각각 50개와 100개의 데이터 입력
	cout << variance(a, 50) << endl;
	cout << variance(b, 100) << endl;
	return 0;
}

double variance(const double arr[], int size)
{
	double sum = 0, sqSum = 0;
	for (int i = 0; i < size; i++) {
		sum += arr[i];
		sqSum += arr[i] * arr[i];
	}
	return sqSum / size - sum * sum / (size * size);
}

위 코드에서는 분산을 구하는 함수인 variance()를 정의하고 함수를 이용하여 a와 b의 분산을 출력하는 것을 볼 수 있다. 비록 분산을 어떻게 구하는지 잘 알지 못하더라도 cout을 사용하고 있는 코드를 보고 분산을 구하여 출력하는 것임을 쉽게 이해할 수 있다. 더불어 분산을 구하는 문장들을 중복하지 않고 프로그램을 작성할 수 있다.

위의 예를 통해 볼 수 있는 것처럼 함수를 사용하는 것은 여러 가지 장점이 있는데, 다음은 그러한 장점의 예이다.

  • 의미 있는 작업 단위로 모듈화하여 프로그램을 분할 작성함으로써, 간결하고 이해하기 쉬운 프로그램을 만들 수 있다.
  • 여러 곳에서 반복 사용되는 기능을 함수로 정의하면 동일 코드를 중복 작성하지 않아도 된다.
  • 잘 설계하여 만든 함수는 그 기능이 필요한 여러 가지 다른 응용에서 재사용하기 쉽다.

반면 함수를 사용하면 함수 호출과 복귀 과정에서 처리 시간이 추가된다는 단점이 있다. 이러한 처리시가의 증가는 매우 작기 때문에 대부분의 상황에서 무시할 수 있지만, 때로는 이마저도 줄여야 할 때도 있다. 이 경우 앞으로 설명할 inline 함수를 이용할 수 있다.