참조 변수
포인터를 선언할 때 * 기호를 이용하는 것은 낯설지가 않다.
참조 변수를 선언할 때는 &기호를 이용하여 선언을 해준다.
#include <iostream>
int main()
{
using namespace std;
int value = 3;
int *ptr = &value;
int &ref = value;
cout << &value << endl;
cout << &ref << endl;
cout << ptr << endl;
cout << &ptr << endl;
return 0;
}
참조변수는 즉 다른말로 하면 어떤 특정한 변수의 별명이라고 할 수 있다. 위의 코드를 실행했을 때 왼쪽과 같은 주소값이 나온다. 즉, 참조변수 ref는 변수 value 의 별명이기 때문에 주소값도 같은 것이다.
참조변수는 반드시 선언시에 초기화를 해주어야 한다.
참조변수를 선언하고 초기화 해줄 때 상수 값을 넣어줄 수 없습니다. 상수 값 자체로 주소를 가질 수 없기 때문이다.
ref에서 value 의 값을 마음대로 바꿀 수도 있기 때문에 const 형식의 변수값은 초기화가 허용이 안된다.
대신 위와 같이 const 를 참조변수 앞에도 붙여주면 문법적으로 허용이 된다.
#include <iostream>
using namespace std;
void function(int n)
{
n = 20;
cout << "In function " << n << endl;
}
int main()
{
int n = 10;
cout << n << endl;
function(n);
cout << n << endl;
return 0;
}
위와 같은 상황에서는 function 함수 내에서만 n이 유효한 것이므로 다시 함수를 나왔을 때는 n 의 값이 그대로 10 임을 알 수 있다.
#include <iostream>
using namespace std;
void function(int &n)
{
n = 20;
cout << "In function " << n << endl;
}
int main()
{
int n = 10;
cout << n << endl;
function(n);
cout << n << endl;
return 0;
}
위와 같은 경우에는 n 의값이 20으로 바뀐 것을 확인할 수 있다. 포인터의 개념(인자에 포인터가 들어갈 때)과는 비슷하지만 reference 를 사용하게 되면 변수 자체가 함수에 넘어가게 되는 것이기 때문에 n의 값에 영향을 주게 되는 것이다. 또한 포인터를 이용할 때는 변수의 주소를 한 번 복사해주어야 하지만 이 경우에는 그럴 필요가 없기 때문에 퍼포먼스 측면에서도 더욱 효율적이다.
#include <iostream>
using namespace std;
struct A
{
int a1;
float a2;
};
struct B
{
A A_a;
};
int main()
{
B B_b;
B_b.A_a.a1 = 1;
return 0;
}
한 가지 용례가 더 있다. 위의 코드처럼 struct A 에 있는 a1 을 struct B를 통해
접근하려고 하면 B_b.A_a.a1 과 같이 접근을 해야 했다. 하지만 reference 를 이용하면
위와 같이 사용할 수 있다. 특히나 a1을 여러번 사용할 경우에는 더더욱 효율적이다.
참조(Reference)에 대해 배워보았다.
아직 실전적으로 많이 쓰지 않아서 유용성에 대해서는 체감하지 못했지만 실제로 많은 개발자들이 잘 사용하는 개념중의 하나라고 하니 익혀둬야겠다.
//피드백 및 문제제기 감사히 받겠습니다.
'Computer Science > C || C++' 카테고리의 다른 글
(C++) 열거형(enumerated types) (0) | 2021.02.07 |
---|---|
전역변수 앞에서의 extern 과 static (0) | 2021.02.07 |
헤더가드의 필요성 (0) | 2021.01.27 |
첫 발걸음 (0) | 2021.01.25 |