본문 바로가기

Programming Languages/C++

[함수]-인수의 전달-값 호출

#include <iostream>
using namespace std;

// 화씨온도를 섭씨온도로 변환하는 함수
// 매개변수 float fahr : 화씨온도
// 반환값 섭씨온도(float)

float FahrToC(float fahr) {  // 함수 FahrToC()를 정의
	return (fahr - 32) * 5 / 9;
}

int main() {
	float fTemp, cTemp;

	cout << "화씨온도 : ";
	cin >> fTemp;
	cTemp = FahrToC(fTemp); // 함수 호출
	cout << "---> 섭씨온도 : " << cTemp << endl;
	return 0;
}

호출된 함수는 호출하는 루틴으로부터 인수를 전달받아 정해진 처리를 한 후 결과를 반환한다. 위 코드에서 함수 FahrToC()는 1개의 인수를 받고 있다. cTemp = FahrToC(fTemp); 에서 fTemp를 실 매개변수로 하여 함수에 인수를 전달하고 있다. FahrToC()에서는 fahr라는 형식 매개변수를 통해 인수를 받고 있다. 이러한 과정을 인수 전달이라고 한다. 프로그래밍 언어에서 인수를 전달하는 방식은 여러 가지가 있는데, C 언어에서는 값 호출(call by value)이라는 방법만을 사용한다. 그러나 C++ 언어에서는 값 호출과 더불어 참조 호출(call by reference)을 사용할 수 있다.

값 호출

값 호출은 실 매개 변수의 값을 형식 매개변수에 복사하여 주는 방식이다. 위 코드에서는 FahrToC()는 값 호출 방식을 사용하고 있다. 일단 값이 형식 매개변수에 전달되면 형식 매개변수와 실 매개변수는 별개의 것이므로 함수 내에서 형식 매개변수의 값을 변경하더라도 실 매개변수의 값은 영향을 받지 않는다. 예를 들어 함수 FahrToC()를 다음과 같이 정의해 보자.

float FahrToC(float fahr)
{
 fahr -= 32;
 return fahr * 5 / 9;
}

겂 호출 방식. (가) 호풀에 사용된 실 매개변수 fTemp의 값이 형식 매개변수 fahr에 복사된다. (나) fahr를 수정해도 fTemp와는 무관하다.

위 그림 (가)와 같이 main()에서 변수 fTemp에 80을 입력한 후 cTemp = FahrToC(fTemp); 에서 함수를 호출하면 fTemp의 값이 FahrToC()의 fahr에 복사된다. 이후 fahr -= 32; 에서와 같이 fahr에서 32를 뺀 값을 fahr에 넣으면 fahr의 값은 바뀐다. 그러나 실 매개변수인 fTemp의 값은 변화가 없다(위 그림 (나) 참조). 이와 같이 일단 호출과정에서 데이터의 복사가 이루어지고 나면 호출하는 함수의 데이터와 호출된 함수의 매개변수가 서로 별개이므로 불필요한 부작용이 발생하지 않는다는 바람직한 특성을 가지고 있다. 그러나 구조체와 같이 비교적 많은 양의 데이터를 포함하고 있는 인수를 전달할때에는 데이터를 복사하는 양이 많아지고, 메모리의 소비량도 많아진다. 또한 때로는 변경된 매개변수의 값을 전달받는 것이 필요한 경우도 있다. 이러한 경우에는 값 호출보다는 참조 호출을 하는 것이 바람직하다.