๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Problem Solving/C++ ์ •๋ฆฌ

C++ #2: reference variable

by ํ–‰๋ฑ 2019. 12. 5.

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

๋Œ“๊ธ€