영넌 개발로그

[C++ 기초] 참조 변수 Reference variable 본문

코딩/C++

[C++ 기초] 참조 변수 Reference variable

영넌 2020. 10. 26. 04:59

참조 변수

- 변수 선언시 &를 붙인다.

- 포인터와는 다른 것. C언어에서는 사용하지 못한다.

- 어떤 공간에 대한 별명을 붙이는 것

 

예시 1>

아래의 예시에서 ra와 a가 같은 공간을 참조한다. (ra는 참조 변수, a는 일반 변수)

a라는 이름으로 액세스 하던 공간을 ra라는 이름으로 액세스 할 수 있다.

int a;
int &ra = a;

 

예시 2>

참조변수에 참조 변수를 넣어도 똑같이 동작한다.

아래 코드에서 a, ra, ka는 같은 공간을 가리킨다.

int a = 11;
int &ra = a ;
int &ka = ra;

 

예시 3>

a, ra, k 를 프린트할 경우 다 같은 값인 50이 나오지만 셋다 같은 공간을 가르키는 건 아니다.

ra와 a가 같은 공간, k는 다른 공간에 만들어진다.

k의 값만 ra의 공간에 옮겨 담은 것이기 때문에 ra=100을 넣어주면 k는 그대로 50 이고 ra,a의 값만 바뀌게 된다.

int a = 55;
int &ra = a;

int k = 50;
ra = k;

ra =100;

 

 

 

 

왜 사용해??

- 함수 호출시 사이즈가 큰 변수의 복사를 피하기 위함

- 포인터의 위험을 피하기 위함

 

  • func_a : Call-by-Value

     함수를 호출(call)할 때, 파라미터로 받은 변수의 값이 통째로 복사가 된다.

     func_a가 실행된 후 파란색 n은 사라지므로 n은 원래 가진 10을 출력한다.

 

  • func_b : Call-by-Address

     주소를 넘긴다. 100이 출력된다.

#include <iostream>

using namespace std;

void func_a(int n) {					void func_b(int *n){
	n = 100;						*n =100;
	return;							return;
}							}

int main()
{
	int n(10);
	func_a(n);

	cout << "n: " << n << endl;

	return 0;
}

주소 100번지를 넘기고 주소를 이용해 공간을 조작함

 

  • func_c : Call-by-Reference
#include <iostream>

using namespace std;

void func_c(int &a) {
	a = 100;
	return;
}

int main()
{
	int n(10);
	func_c(n);

	cout << "n: " << n << endl;

	return 0;
}

빨간색 : main함수에서 n의 공간을 만든다.
분홍색 : 함수가 호출되면 그 주소에 a라는 별명이 붙는다.
         이 별명을 이용해 조작이 가능하다.

함수가 return 되면 붙었던 이름이 사라진다.
(값은 바뀌어 있다.)

 

 

함수 반환형으로 참조 변수 사용하기

하나의 공간에서 모든 것이 이루어짐

만약 int func_a(int n) 이었다면, 함수가 실행되는 동안 새로운 공간이 생기고, 호출 및 반환 시 복사하는 과정이 일어남

만약 int& func_a(int n) 이었다면, 위와 유사하게 동작함

#include <iostream>

using namespace std;

int& func_a(int& n) {
	n = n + 10;
	return;
}

int main()
{
	int k(10);
	k = func_a(k);

	cout << "k: " << k << endl;

	return 0;
}

 

***** 받는 변수를 참조 변수로 했을 경우, 주의해야 할 점이 생김

아래 그림에서 n으로 만들어진 공간은 func_a가 실행될 동안만 살아있는 공간이고 실행이 끝나면 사라진다.

그러나 rk는 n의 공간을 가리키므로.. 엉뚱한 곳을 가리키게 되면서 제대로 된 값이 나오지 않게 된다.

 

***** 파라미터와 반환형을 참조 변수로 했을 경우, main에서 함수 호출과 함께 값을 넣을 수 있는 현상이 생김

이와 같은 것을 방지하기 위해 보통 참조 변수가 반환형일 경우, 앞에 const를 습관적으로 붙여줌

 

 

 

Comments