๋ธ๋ก๊ทธ ๊ธ ์๋จ์ ๊ฐํ์ ์ผ๋ก ๋จ๋ ๊ด๊ณ ๋ ๋ธ๋ก๊ทธ ๊ฐ์ธ ์์ต๊ณผ ๊ด๋ จ ์๋ ํฐ์คํ ๋ฆฌ ์ธก ์์ต ๊ด๊ณ ์ ๋๋ค
C์์ ์ฃผ์๋ฅผ ๋ค๋ฃจ๋ ๋ฐฉ์์ผ๋ก pointer๊ฐ ์ ๊ณต๋๋ค. pointer๋ ๊ทธ ์ด๋ฆ๋ง์ผ๋ก๋ ๊ดํ ๋ง์์ ๋ถํธํ๊ฒ ํ๋ค. ๊ดํ ์๋ชป ์ฐ๋ฉด dangling pointer ๋ฌธ์ ๊ฐ ์ผ์ด๋ ๊ฒ ๊ฐ๊ณ , ๋ง ๊ทธ๋ ๋ค. C++์์๋ ์ด๋ฐ ๊ฐ๋ฐ์๋ค์ ์ฌ์ ๋ถ๋ด์ ๋์ด์ฃผ๊ธฐ ์ํด ์ฃผ์๋ฅผ ํธ๋ค๋งํ ์ ์๋ ๋ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก reference๋ผ๋ ๋ฐฉ์์ ์ ๊ณตํ๋ค. ๊ทธ๋ฌ๋ฉด, pointer์ reference์ ์ฐจ์ด๋ ๋ฌด์์ผ๊น? ์ฐ๋ ๋ฌธ๋ฒ์ด ๋ค๋ฅด๋ค๋ ์์ํ ๋ต๋ณ ๋ง๊ณ , reference๋ง์ ์ฅ์ ์ ๋ถ๊ฐํ ์ ์๋ ์์ ๋ฅผ ํ๋ฒ ๋ณด๊ณ ๋์ด๊ฐ๋ฉด ์ข๋ค. (๊ทธ๋์ผ C++์์ reference๋ผ๋ ๊ธฐ๋ฅ์ ๋์ ํ ์ด์ ๋ฅผ ์ ๋๋ก ์ดํดํ ์ ์๋ค)
๋ชฉ์ฐจ
1. Reference ๋ฌธ๋ฒ ๋ฐ pointer์ ๋น๊ตํ๊ธฐ
2. Reference ์ ํน์ง์ ๋ณด์ฌ์ฃผ๋ ์์ (pointer์ ์ด๋ป๊ฒ ๋ค๋ฅธ์ง ์ ๋๋ก ํ์ธํ๊ณ ๋์ด๊ฐ์)
1. Reference ๋ฌธ๋ฒ ๋ฐ Pointer์ ๋น๊ตํ๊ธฐ
Reference ๋ฌธ๋ฒ
- ๋ ํผ๋ฐ์ค ๋ณ์ ์ ์ธ ๋ฌธ๋ฒ
์๋ฃํ& ๋ณ์๋ช
;
Reference ๋ณ์์ Pointer ๋ณ์ ๋น๊ตํ๊ธฐ
- Reference๋ ํฌ์ธํฐ์ ์ ์ฌํ๊ฒ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ ๊ฐ๋ฅํ๊ฒ ํ๋ค.
- ์ผ๋ฐ์ ์ผ๋ก, reference ๋ณ์๊ฐ ์๋ ์ผ๋ฐ ๋ณ์ (int a)๋ฅผ ์ธ์๋ก ํจ์๋ฅผ ํธ์ถํ๋ ๊ฒฝ์ฐ ์คํ ๋ฉ๋ชจ๋ฆฌ์ '๊ฐ'์ด ๋ณต์ฌ๋๋ค.
- ์ด ๊ฒฝ์ฐ, ์ ๋ฌ๋ ์ธ์๋ ๋์
์ฐ์ฐ์์ R-Value๋ก๋ง ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค (๊ฐ๋ง ๊ฐ์ง๊ณ ์ค์ง, ์ฃผ์์์ ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ)
- // void hello(int a)์ด๊ณ , a = 10์ด๋ผ๊ณ ํ์ ๋,
- 10 = 20; (X) // a = 20;์ด ๋ถ๊ฐ๋ฅํ ์ด์
- b = 10; (O) // b = a;๊ฐ ๊ฐ๋ฅํ ์ด์
- ํ์ง๋ง reference ๋ณ์์ ๊ฒฝ์ฐ R-Value ๋ฟ ์๋๋ผ, L-Value๋ก๋ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค๋ ํน์ง์ ๊ฐ๋๋ค.
- ์ด๋ฌํ ์ ์์ pointer์ ์ ์ฌํ๋ค.
- // void hello(int* a)์ด๊ณ , *a = 10์ด๋ผ๊ณ ํ์ ๋,
- *a = 20; // a๊ฐ ๊ฐ๋ฆฌํค๊ณ ์๋ ๋ฉ๋ชจ๋ฆฌ (10์ด ์ ์ฅ๋์ด์๋)์ 20์ ๋ฃ์ด๋ผ
- b = *a; // b์ a๊ฐ ๊ฐ๋ฅดํค๊ณ ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ฐ (10)์ ๋ฃ์ด๋ผ
- ํ์ง๋ง, pointer์๋ ๋ค๋ฅธ๋ฐ, ๋ํ์ ์ธ ์ฐจ์ด์ ์ด "๋ฌธ๋ฒ์ ์ผ๋ก ํน๋ณํ ์ด๋ค ์ผ์ ํ ํ์๊ฐ ์๋ค"๋ ๊ฒ
- // void hello (int& a)์ด๊ณ , a = 10์ด๋ผ๊ณ ํ์ ๋,
- a = 20;
- b = a;
- ์ด๋ฌํ ์ ์์ pointer์ ์ ์ฌํ๋ค.
- reference ๋ณ์๋ pointer ๋ณ์์๋ ๋ค๋ฅด๋ค.
- ์๋ฐํ๊ฒ ๋งํ์๋ฉด reference ๋ณ์๋ ์ฃผ์ ๊ฐ์ ๋ฐ๊ฟ ์ ์๋ (const) ํฌ์ธํฐ์ด๋ค. ์๋ฅผ ๋ค์ด, int v = 10; ์ผ ๋,
- int& p = v;
- int* const q = &v; // q๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ์ ๋ณ๊ฒฝ ๊ฐ๋ฅํ์ง๋ง, q์ ๋ค์ด๊ฐ๋ ์ฃผ์ ๊ฐ์ ๋ ์ด์ ๋ณ๊ฒฝ ๋ถ๊ฐ
- ๊ทธ๋ฆฌ๊ณ , ๋ฌธ๋ฒ์ ์ผ๋ก ํน๋ณํ ์ด๋ค ์ผ์ ํ ํ์๊ฐ ์๋ค๋ ๊ฒ์ด reference ๋ณ์์ pointer์ ์ฉ๋ฒ์ ๊ฐ๋ฅด๋ ํฐ ํน์ง์ด๋ค.
- '๊ทธ๊ฒ ๋ญ ๊ทธ๋ฆฌ ํฐ ํน์ง์ด๋ผ๊ณ ?'๋ผ๊ณ ์๊ฐํ ์ ์๋ค. ์๋์ ์์ ๋ฅผ ๋ณด์๋ฉด ์ ์ด๋ฐ ๋ง์ ํ๋์ง ์ดํด๊ฐ ๋์ค ๊ฑฐ์์.
- ์๋ฐํ๊ฒ ๋งํ์๋ฉด reference ๋ณ์๋ ์ฃผ์ ๊ฐ์ ๋ฐ๊ฟ ์ ์๋ (const) ํฌ์ธํฐ์ด๋ค. ์๋ฅผ ๋ค์ด, int v = 10; ์ผ ๋,
2. Reference ๋ณ์์ ํน์ง์ ๋ณด์ฌ์ฃผ๋ ์์ (pointer์ ์ด๋ป๊ฒ ๋ค๋ฅธ์ง ์ ๋๋ก ํ์ธํ๊ณ ๋์ด๊ฐ์)
Reference ๋ณ์์ ํจ์ฉ์ฑ์ ์ ๋ณด์ฌ์ฃผ๋ ์๋ ๋ฐ๋ก operator overloading์ด๋ค. (C++์ ํฐ ํน์ง ์ค ํ๋์ด๋ค - C๋ ๋น๊ตํ์ ๋)
Array indexing ์ฐ์ฐ์๋ฅผ overloading ํ๋ค๊ณ ์๊ฐํด ๋ณด์. Arr๋ผ๋ ํด๋์ค๋ฅผ ์ ์ํ๊ณ , ๊ทธ ํด๋์ค ์์๋ pInt๋ผ๋ Int array pointer๊ฐ ์๋ค๊ณ ๊ฐ์ ํ์. ๊ทธ๋ ๋ค๋ฉด [] operator overloading ํจ์์ ๋ฐํ ํ์ ์ด๋ป๊ฒ ๋์ด์ผ ํ ๊น?
- ํจ์ ๋ฐํ ํ์ผ๋ก int ํ์
์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
- (๊ฒฐ๋ก ) Lvalue๋ก indexing ๊ฒฐ๊ณผ๋ฅผ ์ฌ์ฉํ ์ ์๋ค. (์ด๋ ๊ฒ ์ฐ๋ฉด ์ ๋๋ค)
- Arr k;๋ผ๊ณ ํ์, ์ด๋
- int a = k[10]; ์ ๊ฐ๋ฅํ ์ง ๋ชฐ๋ผ๋
- k[10] = 10;์ ๋ถ๊ฐ๋ฅํ๋ค. (๋ฐํ ๊ฐ์ด int ๊ฐ์ด๋๊น)
int Arr::operator[](int idx){
return pInt[idx];
}
- ํจ์ ๋ฐํ ํ์ผ๋ก int* ํ์
์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
- (๊ฒฐ๋ก ) ์ฌ์ฉ์ ๊ฐ๋ฅํ์ง๋ง, ์ผ๋ฐ์ ์ธ indexing ์ฉ๋ฒ์ผ๋ก ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅํ๋ค.
- Arr k;๋ผ๊ณ ํ์, ์ด๋ ๋ฌธ๋ฒ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ด ์จ์ค์ผํ๋ค.
- int a = *k[10];
- int* b= k[10];
- *k[10] = 10;
int* Arr:operator[](int idx){
return pInt + idx;
}
- ๊ทธ๋์ ์ ๋ต์ reference ๋ณ์ ํ์ผ๋ก ๋ฐํ int &๋ก ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
- (๊ฒฐ๋ก ) ์ด ํจ์์๋ reference ๋ณ์ ํ์ ๋ฐ์ ์ฌ์ฉํ ์ ์๋ค.
- Arr k; ๋ผ๊ณ ํ์, ์ด ๋ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์๋ค.
- int a = k[10];
- k[10] = 20;
int& Arr::operator[] (int idx){
return pInt[idx];
}
๋์ ์ฐ์ฐ์ overloading๋ reference ๋ณ์์ ํจ์ฉ์ฑ์ ๋ณด์ฌ์ฃผ๋ ์ข์ ์์์ด๋ค.
์ฌ๋ด์ด์ ๋งบ์๋ง
์ต๊ทผ์๋ '์?'์ ๋ํด์ ์ง๋ฌธ์ ๊ฐ์ง๋งํ ๊ฒ๋ค์ ๋ํด ๊ธ์ ์จ๋ณด์๋ผ๋ ์๊ฐ์ด ๋ค์๋ค. ๋จ์ํ '์ด๋ฌ๋๊น ๋ฐ์๋ค์ฌ'๋ผ๋ ๊ฒ๋ค์์ ํํผํ๋ ๊ฒ์ด ์ข์ ์์ง๋์ด๊ฐ ๋๋ ๊ธธ์ด์, ์ข์ ์ฐ๊ตฌ์๊ฐ ๋๋ ๊ธธ์ด๋ค. ๊ทธ๋ฐ ๊ด์ ์์ ๋ณธ ๊ธ์ ์จ๋ณด์๋ค. "C++ ๋ฌธ๋ฒ์ reference ๋ณ์๋ผ๋ ๊ฒ ์์ด, pointer๋ ๋น์ทํ๊ฒ ์ฃผ์์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ฐ ์ธ ๋ ํจ์ฌ ํธํด!"๋ผ๊ณ reference ๋ณ์๋ฅผ ๋ฐฐ์ ๋ค๋ฉด, ์์ ์ฉ๋ฒ์ ๋ํด์ 8ํ ๋ฐ์ ๋ชจ๋ฅด๋ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ฉด ๋ฌด์์ด pointer์ ๋น์ทํ๊ณ , ์ด๋ค ๊ฒ ๋ค๋ฅธ์ง, ๋น์ทํ๋ค๋ฉด ๊ตณ์ด ์ reference ๋ณ์๋ผ๋ ๊ฒ์ ๋์ ํ๋์ง ์ ๋๋ ์ง๋ฌธํด ๋ณด๊ณ ์ด์ ๋ํด ๋ต์ ์๊ฐํด ๋ณด๋ ์์ง๋์ด๊ฐ ๋์ ๐ค
๋ โผ๏ธ
'IN DEPTH CAKE > Coding-WIKI' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
sphinx-js ๋ก javascript ์ฝ๋ ๋ฌธ์ํํ๊ธฐ (0) | 2023.05.03 |
---|---|
No module named 'tensorboard' ํด๊ฒฐ (0) | 2023.03.28 |
[pytorch] RuntimeError: one_hot is only applicable to index tensor (0) | 2023.03.18 |
[python] Anaconda ํ๊ฒฝ yamlํ์ผ export ๋ฐ import (ํ๊ฒฝ ์์ฑ create, ํ์ฑํ activate ๋ฑ) (0) | 2023.03.17 |
<VSCode ๋ฅผ C++ IDE๋ก ์ฐ๊ธฐ> Mac์์ C++ ๊ฐ๋ฐํ๊ธฐ (6) | 2023.03.07 |