본문 바로가기

Algorithm 문제 풀이/C++

[C++] 함수와 참조자

이전 글과 이어서 이번에는 함수에서 참조자를 선언하고 참조자를 반환하는 것에 대해 알아보겠습니다.

 

더보기
  1. 반환형이 참조이고 반환도 참조로 받는 경우
  2. 반환형이 참조이되 반환을 변수로 받는 경우

 

1. 반환형이 참조이고 반환도 참조로 받는 경우 

#include <iostream>

using namespace std;

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

int main(void) {
	int num1 = 1;
	int& num2 = RefRetFuncOne(num1);
	cout << "num1: " << num1 << endl;
	cout << "num2: " << num2 << endl;

	num1++;
	num2++;
	cout << "num1: " << num1 << endl;
	cout << "num2: " << num2 << endl;

	cout << "&num1: " << &num1 << endl;
	cout << "&num1: " << &num2 << endl;

	return 0;
}

결과

코드에 함수 정의 부분에서 함수명 앞에 &가 붙고, 매개변수 앞에 &가 붙은 것을 볼 수 있죠. 이것은 참조형으로 반환한다는 것을 뜻합니다.

그리고 main함수를 보시면, num2가 참조자로 선언하여 함수의 반환을 참조로 받을 것을 볼 수 있습니다. 이것은 num2의 메모리 공간을 확보하지 않고 num1의 메모리 공간에 접근한다는 것입니다. 따라서 num1과 num2는 같은 공간을 가르키고 있어 num1를 증가시키든 num2를 증가시키든 함께 숫자가 커지는 것을 알 수 있습니다.

 

 

 

2. 반환형이 참조이되 반환은 변수로 받는 경우 

#include <iostream>

using namespace std;

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

int main(void) {
	int num1 = 1;
	int num2 = RefRetFuncOne(num1);
	cout << "num1: " << num1 << endl;
	cout << "num2: " << num2 << endl;

	num1 += 2;
	num2 += 100;
	cout << "num1: " << num1 << endl;
	cout << "num2: " << num2 << endl;

	cout << "&num1: " << &num1 << endl;
	cout << "&num1: " << &num2 << endl;

	return 0;
}

이 코드는 위의 코드와 마찬가지로 함수의 반환형은 참조이지만 반환을 받을 때 num2가 참조자로 선언되지 않고 변수로 받은 것입니다. 따라서 num2는 독립된 메모리 공간을 확보한 것이므로 num1과 num2가 가르키는 메모리 공간은 다릅니다. 그렇기 때문에 코드 상에서도 num1을 2만큼 증가시켜도 num2는 그대로이고, num2를 100만큼 증가시켜도 num1은 그대로인 것을 볼 수 있습니다.

 

 

이어서 다음 코드를 보겠습니다.

 

#include <iostream>

using namespace std;

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

int main(void) {
	int num1 = 1;
	int num2 = RefRetFuncOne(num1);
	cout << "num1: " << num1 << endl;
	cout << "num2: " << num2 << endl;

	num1 += 2;
	num2 += 100;
	cout << "num1: " << num1 << endl;
	cout << "num2: " << num2 << endl;

	cout << "&num1: " << &num1 << endl;
	cout << "&num1: " << &num2 << endl;

	return 0;
}

결과

이 코드를 보시면, 매개변수 앞에는 &가 붙어있지만 함수명 앞에는 &가 붙어지지 않았습니다. 이는 참조로 받아서 참조가 아닌 값을 반환한다는 것을 뜻함니다. num2 변수도 그 값을 대입한다는 것이죠. 결과적으로 앞의 코드와 실행결과는 같습니다. 하지만 앞의 코드는 변수 num2에 반환된 참조자를 반환한 것을 대입한 것이고 이 코드는 값을 반환받은 것을 대입한 것이라는 차이가 있습니다. 

 

 


정리

1. 반환형이 참조이고 반환도 참조로 받는 경우 2. 반환형이 참조이되 반환은 변수로 받는 경우
num1과 num2가 가르키는 메모리 공간이 같다. num1과 num2가 가르키는 메모리 공간이 다르다.