reference variable
๋ ํผ๋ฐ์ค ๋ณ์๋ ํฌ์ธํฐ ๋ณ์ ์ฌ์ฉ ์ ๋ฐ์ํ ์ ์๋ ์ฌ๋ฌ ์๋ฌ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ํ์ํ๋ค.
ํฌ์ธํฐ ๋ณ์์ ๊ฐ์ด ์ค์ ๋ก ์ฃผ์๊ฐ์ ์ ์ฅํ์ง๋ง ๋ช ๊ฐ์ง ๋ค๋ฅธ ํน์ง๋ค์ด ์๋ค.
1) ๋ณ์์ ๋ณ์นญ
๋ ํผ๋ฐ์ค ๋ณ์๋ ์ฐธ์กฐ ๋์์ ๋ณ์นญ์ฒ๋ผ ์ฌ์ฉํ ์ ์๋ค. ์๋ฅผ ๋ค์ด,
int num1 = 10;
int &num2 = num1;
num2 = 20;
cout << num1 << endl;
cout << num2 << endl;
์์ ๊ฐ์ ์ฝ๋๋ฅผ ์คํํด๋ณด๋ฉด num1๊ณผ num2 ๋ชจ๋ 20์ผ๋ก ์ถ๋ ฅ๋๋ค.
num2๊ฐ num1์ ๋ณ์นญ (๋ค๋ฅธ ์ด๋ฆ) ์ฒ๋ผ ์ฌ์ฉ๋ ๊ฒ์ด๋ค.
์ฐธ๊ณ ๋ก ํ ๋ณ์๋ ์ฌ๋ฌ ๋ ํผ๋ฐ์ค ๋ณ์๋ฅผ ๋ ์ ์๋ค.
2) NULL ๋นํ์ฉ (ํฌ์ธํฐ ๋ณ์๋ ํ์ฉ)
๋ ํผ๋ฐ์ค ๋ณ์๋ NULL์ ํ์ฉํ์ง ์์์ผ๋ก์จ Segmentation fault, Null pointer exception๊ณผ ๊ฐ์ ์๋ฌ๋ฅผ ๋ฐฉ์งํ๋ค.
NULL์ด ํ์ฉ๋์ง ์๊ธฐ ๋๋ฌธ์,
ํด๋น ๋ณ์๊ฐ NULL์ธ์ง ์๋์ง ํ์ธํ๊ณ ๊ทธ์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ํ๋ํ๋๋ก ์ฝ๋ฉํ๋ ๊ณผ์ (validation) ์ ์๋ตํ ์ ์๋ค.
3) ์ฐธ์กฐ ๋์ ํ ๋น ๋ฐ ์ ๊ทผ ๋ฐฉ๋ฒ์ ์ฐจ์ด
ํฌ์ธํฐ ๋ณ์๋ & ์ฐ์ฐ์ ํตํด ์ฐธ์กฐ ๋์์ ์ฃผ์๊ฐ์ ํ ๋นํ๋ค๋ฉด,
๋ ํผ๋ฐ์ค ๋ณ์๋ ๋ค์๊ณผ ๊ฐ์ด ์ฐธ์กฐ ๋์ ์์ฒด๋ฅผ ์ง์ ํ ๋นํ๋ค.
int a = 10;
int *pa = &a;
int &ra = a;
๋ ํผ๋ฐ์ค ๋ณ์๋ ๋ฐ๋์ ์ ์ธ๊ณผ ๋์์ ์ด๊ธฐํ๋ฅผ ํด์ผํ๋ค. (otherwise compiler error)
์ฆ ๋ ํผ๋ฐ์ค ๋ณ์์๋ ์ ์ด์ NULL์ด ํ ๋น ๋ถ๊ฐ๋ฅํ๋ค.
ํจ์์์ ๋ ํผ๋ฐ์ค ๋ณ์๋ฅผ ๋๊ฒจ๋ฐ์ผ๋ฉด
(*, -> ๊ฐ์ ํฌ์ธํฐ ์ฐ์ฐ์ ์์ด) ํจ์ ๋ด์์ ๋ง์น (๋ฌธ๋ฒ์) ์ง์ญ๋ณ์์ฒ๋ผ ์ฌ์ฉํ ์ ์๋ค.
๋ค๋ง ๋ ํผ๋ฐ์ค ๋ณ์ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด,
๋ ํผ๋ฐ์ค๊ฐ ์ฐธ๊ณ ํ๊ณ ์๋ ์ค์ ๋ณ์์ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ ๊ฒ์ด๋ค.
(์ด ๋ถ๋ถ์์๋ ๋ง์น caller์ callee๊ฐ ๊ณต์ ํ๋ ๋ณ์์ธ ๋๋์ด๋ค.)
4) ์ฐธ์กฐ ๋์ ๋ณ๊ฒฝ ๋นํ์ฉ (ํฌ์ธํฐ ๋ณ์๋ ํ์ฉ)
๋ ํผ๋ฐ์ค ๋ณ์์ ํ ๋ฒ ์ฐธ์กฐ ๋์์ ํ ๋นํ๋ฉด, ๋ ์ด์ ์ฐธ์กฐ ๋์์ ๋ณ๊ฒฝํ ์ ์๋ค.
5) ํด๋์ค ๋ฉค๋ฒ ์ ๊ทผ ๋ฐฉ๋ฒ์ ์ฐจ์ด
class Snake
{
void Attack();
}
Snake cobra;
Snake &r_cobra = cobra;
r_cobra.Attack();
Snake *p_cobra = cobra;
p_cobra->Attack();
์์์ ์ดํด๋ณธ ๋ ํผ๋ฐ์ค ๋ณ์์ ํน์ฑ์ ์๊ฐํ๋ฉด,
ํด๋์ค ๋ฉค๋ฒ ์ ๊ทผ ์
ํฌ์ธํฐ ๋ณ์๋ -> ์ฐ์ฐ์๋ฅผ, ๋ ํผ๋ฐ์ค ๋ณ์๋ . ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ด๋ ์ ๋ ์ํตํ๋ค.
References
http://k96-ozon.tistory.com/27 (reference variable)
http://gracefulprograming.tistory.com/11 (reference variable)
http://whitesnake.uzoo.in/29 (reference variable)
'Problem Solving > C++ ์ ๋ฆฌ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
C++14 STL ์ฒ ์ ์ ๋ฌธ) vector (0) | 2020.05.20 |
---|---|
C++ #4: preprocessor directives (0) | 2019.12.07 |
C++ #3: call by value, address, reference (0) | 2019.12.06 |
C++ #1: iostream, namespace (0) | 2019.12.05 |
C++ note (0) | 2019.12.05 |
๋๊ธ