함수의 리턴값

C++의 함수는 기본적으로 하나의 값만 반환할 수 있습니다. [ return 값 ] 의 형식이 바로 그것이죠.

 

참고로 main 함수도 값을 리턴합니다.

 

습관적으로 써놓는 return 0; 는 런타임에게 프로세스의 정상적 종료를 알리는 문장입니다.

 

C++의 함수에서는 하나의 값을 리턴하는 제한 사항이 있기 때문에 여러개의 리턴값을 받으려면 다른 방법을 써야합니다. 어떤 방법이 있을까요?

 

그렇습니다. 예상할 수 있는 것 처럼 포인터와 레퍼런스를 사용할 수 있습니다. 엄밀히 말하면 여러개의 리턴값을 받는 것은 아니지만 함수의 매개변수에 포인터를 선언해서 main 변수들의 값을 변경합니다. 이렇게 하면 두개가 아니라 100개의 변수의 값도 변경할 수 있겠죠.

 

문법적으로 다중 리턴값을 지원하는 파이썬 같은 언어도 있지만 C++에서는 포인터와 레퍼런스를 사용합니다.

 

수의 제곱과 세제곱을 구하는 함수예제를 통해 알아보겠습니다.

 

포인터 사용

함수 원형을 아래와 같이 선언합니다.

 

첫번째 매개변수를 제곱하고 세제곱할 것이니까 두번째, 세번째에 * 포인터를 선언합니다.

 

함수의 내부에서 역참조를 사용해서 값을 변경합니다. main 에 있는 변수들의 값이 직접 변경됩니다. 하나의 리턴 값은 함수 실행의 결과 값을 반환하는데 사용합니다.

 

 

main 함수에서 변수의 주소값을 인수로 전달합니다. 함수실행이 정상적으로 종료되면 결과를 표시하도록 합니다.

 

 

레퍼런스 사용

포인터가 있으니 레퍼런스도 되겠죠? 레퍼런스의 함수 원형은 아래와 같습니다.

 

 

함수의 매개변수를 레퍼런스로 선언하면 main의 변수값을 함수에서 직접 변경할 수 있습니다.

 

 

main 에서 호출할 때는 그냥 변수 이름을 전달합니다.

 

 

포인터와 레퍼런스의 결과가 같습니다.

 

요약

함수에서 하나 이상의 리턴값이 필요한 경우 포인터를 사용합니다.

 

함수의 매개변수에 포인터를 선언하는 방법과 레퍼런스를 선언하는 두 가지 방법이 있습니다.

 

포인터와 다르게 레퍼런스를 사용하면 레퍼런스가 가리키는 대상 객체(target object)를 변경할 수 없는 점도 있습니다.

 

 

*예제코드 - 포인터와 레퍼런스

#include <iostream>

using namespace std;

int Factor(int, int*, int*);

int FactorRef(int, int&, int&);

int main()
{
	int number, squared, cubed;
	int error;

	cout << "숫자를 입력하시오 (0 - 10): ";
	cin >> number;

	// error = Factor(number, &squared, &cubed);
	error = FactorRef(number, squared, cubed);

	if (!error)
	{
		cout << " 숫자: " << number << endl;
		cout << " 면적: " << squared << endl;
		cout << " 부피: " << cubed << endl;
	}
	else {
		cout << "Error!" << endl;
	}

	return 0;
}

int Factor(int n, int* ptrSquared, int* ptrCubed)
{
	int result = 0;
	if (n > 10)
		result = 1;
	else
	{
		*ptrSquared = n * n;
		*ptrCubed = n * n * n;
		result = 0;
	}
	return result;
}

int FactorRef(int n, int& refSquared, int& refCubed)
{
	int result = 0;
	if (n > 10)
		result = 1;
	else
	{
		refSquared = n * n;
		refCubed = n * n * n;
		result = 0;
	}
	return result;
}

공유하기

facebook twitter kakaoTalk kakaostory naver band