Definition
사전적 의미는 '참조'
나의 관점에서 DB에서 'alias' 와 상당히 비슷한 느낌을 받았다.
즉 별명을 지어준다는 것
When to use
C의 Call by Value, Call by reference 에서
Call by reference의 parameter로 포인터 변수 (주소값)을 넘겨본 경험이 있을것이다.
포인터 변수도 결국 메모리를 차지한다.
근데!!
C++은 마치 Call by Reference처럼
References as function parameters .. i.e. 함수 내에서 값은 변경 할 수 있으면서(주소에 접근할 수 있으면서)
별도의 메모리 할당이 없다는 장점이 있다.
※ 레퍼런스는 한 번 초기화 되면 다른 변수의 별명이 될 수 없음.
* operloading some operators like ++
* accessed by dot operator('.')
* passing the argument in the copy constructor
Differences between Reference and Pointer
Refenrece | Pointer | |
void Pointer | X | O |
Indirection level | just one | single, double.. triple ... |
when to use | In function as parameters and return types | passing NULL-pointer To implement data structures in C++ (Java reference operate as copy constructor default) |
Operation
reference는 컴파일 시에 원래 가리키던 변수의 주소값으로 치환된다.
(*(주소값) 으로)
Example
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#include <iostream>
void changeValue(int &ref) // &는'주소'를 가리키는 기호
//내부적으로 int& ref = a 라는 문장이 수행됨.
{
ref = 777;
}
int main(void)
{
int a = 333;
std::cout << a << std::endl;
changeValue(a);
std::cout << a << std::endl;
return 0;
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
int a = 333;
std::cout << a << std::endl;
changeValue(a);
std::cout << a << std::endl;
std::cout << ref << std::endl; << 요놈을 추가한다면?!
return 0;
|
std::cout << ref << std:endl;
레퍼런스를 출력하려고 했는데
다음과 같은 에러가 난다.
[Error] 'ref' was not declared in this scope
1
2
3
4
|
void changeValue(int &ref)
{
ref = 777;
}
|
보면 changeValue라는 함수는
ref라는 레퍼런스를 생성하고
4번라인의 '}'를 만나는 순간 사라진다.
changeValue(a); // 요 라인에서 다음라인으로 넘어가는 순간 ref는 존재하지 않는다.
(이 설명은 함수나 변수가 어떻게 메모리에 잡히는지 알고있어야 이해할 수 있다..
우리가 C / C++ 같은 언어를 배우면서 익혀야할 것은 이런 메모리상에서 일어나는 일들을 이해하는게 아닌가 싶다..)
5. Memory Map
얼핏 보면 change Value에서 REF라는 변수를 선언하고 a 값을 복사해온것 같지만 사실상 이 함수내에서 한 일은
ref라는 레퍼런스가 a의 주소를 가리키게 한 것 , 그리고 a의 주소로 접근하여 777이란 값을 대입해준 것이 다다.
(다시 말하지만, 포인터 변수도 주소를 가리키지는건 동일하지만 차이점은 Reference의 경우 별도의 메모리 공간을 차지하지 않는다는 것이다.)
또한, changeValue 로컬함수의 수행이 '}'을 만남으로써 끝나면 Reference 설정도 해제되기 때문에..
main 함수 <-> changeValue간 Scope 차이로 인해서
ref를 출력하려고하면 오류가 나는것!
[추가 예제]
Function of Return Reference
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
#include <iostream>
using namespace std;
int fn1(int &a)
{
return a;
}
// return 이 단순 int a라는놈 '값' (r-value) << register 영역 (Read Only, Write XX)
int& fn2(int &b)
// return이 b라는 reference가 참조하는 변수 << x그자체.
{
return b;
}
int main(void)
{
int x = 1;
cout << fn1(x) << endl;
cout << ++fn2(x) << endl;
return 0;
}
|
주석 참고 ^ㅡ^
결과는 ~ 예측해보소
'C > C++' 카테고리의 다른 글
Copy Constructor (0) | 2019.11.20 |
---|---|
character array vs String (0) | 2019.11.10 |
[백준 2752] 세 수 정렬하기 (0) | 2019.10.28 |
[기초 100제] 98번 설탕과자 뽑기 (0) | 2019.10.27 |
[코드업 기초 100제 - 85번] 소리 파일 저장용량 계산하기 (0) | 2019.10.07 |