영넌 개발로그
[C++ 기초] 참조 변수 Reference variable 본문
참조 변수
- 변수 선언시 &를 붙인다.
- 포인터와는 다른 것. 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의 공간을 만든다. |
함수가 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를 습관적으로 붙여줌
'코딩 > C++' 카테고리의 다른 글
[C++ 기초] 객체 참조 / 객체 참조 포인터 / this 포인터 / SLL 구현 (0) | 2020.10.26 |
---|---|
[C ++ 기초] 함수 기본 파라미터 , OOP (객체기반프로그래밍), 생성자 constructor (0) | 2020.10.26 |
[C++ 기초] 함수 파라미터, 아규먼트로 배열 입력(1차원, 다차원) /함수 포인터 Function Pointer (0) | 2020.10.23 |
[C++ 기초] text file 읽고 쓰기, fstream 헤더 (0) | 2020.10.23 |