[C++] #7 참조자와 함수 - 참조자(&)를 반환하는 함수

반응형
반응형

[목차]

#1 반환형이 참조자(&)인 함수

#2 반환형이 기본자료형인데, 참조자(&)를 반환하는 함수

*개인적인 C++ 공부 내용을 정리하는 용도로 작성된 글 이기에 잘못된 내용이 있을 수 있습니다.


#1 반환형이 참조자(&)인 함수

함수의 반환형은 기본 자료형 뿐 만 아니라 참조자(&)가 선언될 수 도 있다. 다음 코드를 보고 num1 과 num2 변수의 결과값을 예측해 보자.

#include <iostream>
using namespace std;

int& RefReturn(int &ref)
{
	ref++;
	return ref;
}

int main(){
	int num1 = 10;
	int &num2 = RefReturn(num1);
	
	num1++;
	num2++;
	
	cout << "Num1 : " << num1 << endl;
	cout << "Num2 : " << num2;
	
	return 0;
}
[출력결과]
Num1 : 13
Num2 : 13

 

이해하기 쉽도록 그림으로 나타내어 보았다.

 

위의 그림에서 주의깊게 봐야할 부분은, 매개변수로 선언된 ref 참조자가 소멸되는 부분이다. 매개변수로 선언된 참조자는 변수와 동일한 성격을 갖기에, RefReturn 함수가 num2 참조자에게 ref 참조자를 반환을 하면, ref 참조자는 소멸한다.

 

이번에는 코드를 약간 변경해 보았다. num2를 참조자가 아닌 일반 변수로 받았다. 다음 코드의 결과를 예측해 보자.

#include <iostream>
using namespace std;

int& RefReturn(int &ref)
{
	ref++;
	return ref;
}

int main(){
	int num1 = 10;
	int num2 = RefReturn(num1);
	
	num1++;
	num2+=10;
	
	cout << "Num1 : " << num1 << endl;
	cout << "Num2 : " << num2;
	
	return 0;
}
[출력결과]
Num1 : 12
Num2 : 21

위의 예제는 num2변수 가 num1변수의 참조자가 아닌 별개의 변수이기에, num1변수와 독립적으로 계산이 되었다.

이처럼 반환형이 참조자인 함수의 반환값을 어떤 형태로 저장하느냐에 따라 결과가 완전히 달라진다. 


#2 반환형이 기본자료형인데, 참조자(&)를 반환하는 함수

다음으로 반환형은 기본자료형 이지만, 참조자(&)를 반환하는 함수의 동작 과정을 분석해 보자. 아래 코드를 보고 결과값을 예측해 보자.

#include <iostream>
using namespace std;

int RefReturn(int &ref)
{
	ref++;
	return ref;
}

int main(){
	int num1 = 10;
	int num2 = RefReturn(num1);
	
	num1++;
	num2+=10;
	
	cout << "Num1 : " << num1 << endl;
	cout << "Num2 : " << num2;
	
	return 0;
}
[출력결과]
Num1 : 12
Num2 : 21

 

#1의 2번째 케이스와 결과는 동일하다. 하지만 다음과 같은 차이가 있다.

반환형이 참조형인 RefReturn 함수는 2가지 형태로 반환값을 저장할 수 있다.

int &num2 = RefReturn(num1); //참조형에 저장 (O)
int num2 = RefReturn(num1); //변수에 저장 (O)

 

하지만 반환형이 기본자료형인 RefReturn 함수는 반환값을 반드시 변수에 저장해야 한다. 왜냐하면 반환형을 기본 자료형으로 선언한 RefReturn 함수의 반환값은 상수나 다름 없기 때문이다.

int &num2 = RefReturn(num1); //참조형에 저장 (X) . . . 불가능
int num2 = RefReturn(num1); //변수에 저장 (O)

반응형

댓글

Designed by JB FACTORY