728x90
*<์น์ด๋จน๋ C++>์ ๋ณด๋ฉฐ ๊ณต๋ถํ์ฌ ์ ๋ฆฌํ ๊ธ์ ๋๋ค.
1. ์ฐธ์กฐ์(Reference)๋?
- C ์ธ์ด์์๋ ํจ์์ ์ธ์ ์ ๋ฌ ์, ์๋ณธ์ ๋ฐ๊พธ๋ ๋ฐฉ๋ฒ์ผ๋ก๋ Call by address๋ฐ์ ์์๋ค.
- ํ์ง๋ง, C++์์๋ Call by address ์ธ์๋ ๋ค๋ฅธ ๋ณ์๋ ์์๋ฅผ ๊ฐ๋ฆฌํฌ ์ ์๋ ์ฐธ์กฐ์(Reference) ๋ฐฉ์๋ํ ์ง์ํ๋ค.
- ํฌ์ธํฐ์ ๋ฌ๋ฆฌ &์ * ์ฐ์ฐ์ ์ฌ์ฉ์ด ์ค๊ธฐ ๋๋ฌธ์ ์ฝ๋๋ฅผ ํจ์ฌ ๊ฐ๊ฒฐํ๊ฒ ๋ํ๋ผ ์ ์๋ค.
- scanf()์ ๋ฌ๋ฆฌ cin์ด &๋ฅผ ์ฌ์ฉํ์ฌ ์ฃผ์๊ฐ์ ์ค ํ์๊ฐ ์๋ ๊ฒ๋ cin ๋ด๋ถ์ ์ผ๋ก ์ฐธ์กฐ๋ฅผ ๋ฐ๊ธฐ ๋๋ฌธ์ด๋ค.
int x = 5;
int& referenceX = x; // ์ฐธ์กฐ์ ์ ์ธ
referenceX = 10;
std::cout << "x = " << x << std::endl;
std::cout << "referenceX = " << referenceX << std:endl;
/* ๊ฒฐ๊ณผ
x = 10
referenceX = 10
*/
- ์ฐธ์กฐ์ ์ ์ธ ๋ฐฉ๋ฒ์ ๊ฐ๋ฆฌํค๊ณ ์ ํ๋ ํ์
๋ค์ &๋ฅผ ๋ถ์ด๋ฉด ๋๋ค. ( Ex. int& )
- ์ฐธ์กฐ์ ์ ์ธ์ ํตํด ์ปดํ์ผ๋ฌ์๊ฒ ๋ ๋ค๋ฅธ ์ด๋ฆ์ด๋ผ๊ณ ์๋ ค์ฃผ๋ ๊ฒ
- ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ ์ฝ๋์์ referenceX์ ๊ฐ์ ๋ฐ๊ฟ๋ ์ฌ์ค์ x์์ ์์ ์ ํ๋ ๊ฒ๊ณผ ๊ฐ๋ค.
์ฐธ์กฐ์๋ ๋ฐ๋์ ์ด๊ธฐ๊ฐ์ ์ฃผ์ด์ผ ํ๋ค.
- ํฌ์ธํฐ์ ๋ฌ๋ฆฌ, ์ฐธ์กฐ์๋ ์ ์ ์์ ๋ฐ๋์ ๋๊ตฌ์ ๋ณ๋ช ์ธ์ง ๋ช ์ (๊ทธ๋ฌ์ง ์์ ๊ฒฝ์ฐ ์ค๋ฅ ๋ฐ์)
int x = 5;
// int& referenceX; ์ค๋ฅ
int& referenceX = x; // ์ด๊ธฐ๊ฐ ์ง์ ํ์
- ํ๋, ํจ์์ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์ ๋๋ ๋ช ์ํ์ง ์์๋ ๋๋ค.
void Swap(int& x, int& y) { // ๋งค๊ฐ๋ณ์๋ก ์ฐธ์กฐ๋ฅผ ๋ฐ์ ์ ์์
int temp = x;
x = y;
y = temp;
}
int main() {
int x = 10;
int y = 20;
Swap(x, y);
}
- Swap(x, y) ํจ์๋ฅผ ํธ์ถํ๋ ์์ ์์ ๋งค๊ฐ๋ณ์ int& x, int& y๊ฐ ์ ์๋๋ฏ๋ก ์ฌ์ค์ int& x = x, int& y = y๊ฐ ์คํ๋จ
- ๋ฐ๋ผ์, ๋ฌธ์ ๊ฐ ๋ ์์ง๊ฐ ์์
ํ ๋ฒ ๋ณ๋ช ์ค์ ์ด ๋๋ฉด, ๋ค๋ฅธ ๋ณ๋ช ์ผ๋ก ๋ณ๊ฒฝ์ด ๋ถ๊ฐ๋ฅ
- ์ฐธ์กฐ์ ๋ณ๋ช ์ด ์ค์ ๋๋ฉด, ๋ค๋ฅธ ๋ณ๋ช ์ผ๋ก ์ค์ ํ๋ ค๊ณ ํด๋ ๋จ์ ๋์ ์ฐ์ฐ์ผ๋ก ์ทจ๊ธ๋๋ค.
- ๋ฒ์ธ๋ก, ํฌ์ธํฐ๋ ๋ค๋ฅธ ๋์์ ๊ฐ๋ฆฌํค๋๋ก ์์ ๋กญ๊ฒ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ๋ค.
int x = 5;
int& referenceX = x; // ๋ณ๋ช
์ค์ ์ฐ์ฐ
int y = 10;
referenceX = y; // referenceX = 10; ๊ณผ ๊ฐ์ ์ฐ์ฐ
// &referenceX = y; ๋ถ๊ฐ๋ฅ
์ฐธ์กฐ(Reference)๋ ๋ฉ๋ชจ๋ฆฌ ์์ ์กด์ฌํ์ง ์์ ์๋ ์๋ค.
- ํฌ์ธํฐ ๋ณ์ ์ญ์, ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๋ด์๋๋ ๋ณ์์ด๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ์์ ์กด์ฌํ๋ค. (64bit ์ํคํ ์ฒ์ ๊ฒฝ์ฐ, 8 byte)
- ํ๋, ์ฐธ์กฐ์ ๊ฒฝ์ฐ์๋ ์ฐธ์กฐ๊ฐ ์ฐ์ด๋ ์ฝ๋ ์๋ฆฌ๋ ์ฐธ์กฐํ ์๋ณธ ๋์์ผ๋ก ๊ต์ฒดํ๋ฉด ๋๋ค.
- ๊ทธ๋ ๊ธฐ์ ์ฐธ์กฐ๋ ๋ฉ๋ชจ๋ฆฌ ์์ ์กด์ฌํ ํ์๊ฐ ์์ผ๋, ๋ฐ๋์ ๊ทธ๋ฐ ๊ฒ์ ์๋๋ค.
int x = 10;
int& referenceX = x;
...
referenceX = 20; // x = 20;์ผ๋ก ์ปดํ์ผ๋ฌ๊ฐ ๋ฐ๊พธ๋ฉด ๋๋ค.
2. ์ฐธ์กฐ์์ ๊ด๋ จ๋ ๊ธ์ง ์ฌํญ
์ฐธ์กฐ์ ์ฐธ์กฐ์๋ฅผ ์์ฑํ๋ ๊ฒฝ์ฐ๋ ๋ถ๊ฐ๋ฅ
int x = 5;
int& y = x;
int& z = y; // ์ฐธ์กฐ์์ ์ฐธ์กฐ์๋ฅผ ๋ง๋๋ ๊ฒ ์๋ x์ ์ฐธ์กฐ์๋ฅผ ์์ฑํ๋ ์ฐ์ฐ
std::cout << x << std::endl; // 5
std::cout << y << std::endl; // 5
std::cout << z << std::endl; // 5
๋จ์ ๋ฆฌํฐ๋ด์ ๋ํ ์ฐธ์กฐ์ ์์ฑ์ ๋ถ๊ฐ๋ฅ
- ์์ ๊ทธ ์์ฒด์ธ ๋ฆฌํฐ๋ด์ ๋ํ ์ฐธ์กฐ์ ์์ฑ์ด ๊ฐ๋ฅํ๋ฉด, ๋ฆฌํฐ๋ด ๊ฐ ์์ฒด๋ฅผ ๋ฐ๊ฟ ์ ์๊ฒ ๋๋ ๋ชจ์์ด ์๊ธฐ๊ธฐ ๋๋ฌธ
- ์์ ์ฐธ์กฐ์๋ก ์ ์ธํ๋ค๋ฉด ๋ฆฌํฐ๋ด๋ก ์ฐธ์กฐ๊ฐ ๊ฐ๋ฅ
// int& x = 10; 'initializing' ์ค๋ฅ ๋ฐ์
const int& x = 10; // ์์ ์ฐธ์กฐ์๋ก๋ ๋ฆฌํฐ๋ด ์์ ์ฐธ์กฐ ๊ฐ๋ฅ
์ฐธ์กฐ ๋ฐฐ์ด์ ์์ฑํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅ
/*
์ฐธ์กฐ ๋ฐฐ์ด์ ์ฌ์ฉํ ์ ์๋ค.
int x, y;
int& arr[2] = { x, y };
*/
- ์ฐธ์กฐ์์ ๊ฒฝ์ฐ, ํน๋ณํ ๊ฒฝ์ฐ๊ฐ ์๋ ์ด์ ๋ฉ๋ชจ๋ฆฌ ์์์ ๊ณต๊ฐ์ ์ฐจ์งํ์ง ์๋๋ค.
- ๋ฐฐ์ด์ ํน์ฑ์, ๋ฐฐ์ด์ ์ด๋ฆ์ ์ฒซ ๋ฒ์งธ ์์์ ์ฃผ์๊ฐ์ผ๋ก ๋ณํ์ด ๋ ์ ์์ด์ผ ํ๋๋ฐ ์ฌ๊ธฐ์ ๋ชจ์์ด ์๊ธด๋ค.
- ๋ฐฐ์ด์ ๋ํ ์ฐธ์กฐ๋ ๊ฐ๋ฅํ๋ค. ๋จ, ํฌ์ธํฐ์ ๋ฌ๋ฆฌ ๋ฐ๋์ ๋ฐฐ์ด์ ํฌ๊ธฐ๋ฅผ ๋ช ์ํด์ผ ํจ
// ๋ฐฐ์ด ์ฐธ์กฐ๋ ์ฌ์ฉํ ์ ์๋ค.
int arr[3] = {10, 20, 30};
int (&refArr)[3] = arr; // ๋ฐฐ์ด ํฌ๊ธฐ ๋ช
์
for (int i = 0; i < 3; i++) {
std::cout << refArr[i] << std::endl;
}
// ์ด์ฐจ์ ๋ฐฐ์ด ์ญ์ ๋์ผ
int arr[2][2] = {1, 2, 3, 4};
int (&refArr)[2][2] = arr;
ํฌ์ธํฐ์ ๋ํ ์ฐธ์กฐ์๋ ์์ฑ ๋ถ๊ฐ๋ฅ
int x = 5;
int* ptr = &x;
// int& refPtr = ptr; ์ค๋ฅ
์ฐธ์กฐ๋ฅผ ๋ฆฌํดํ๋ ํจ์์์ ์ง์ญ ๋ณ์์ ์ฐธ์กฐ๋ฅผ ๋ฆฌํดํ์ง ์๋๋ก ์กฐ์ฌ
- ํจ์ ๋ด๋ถ์์ ์ง์ญ๋ณ์์ ๋ํ ์ฐธ์กฐ๋ฅผ ๋ฆฌํดํ๊ณ ๋๋ฉด, ์ง์ญ๋ณ์์ ์์กด ์๊ฐ ํน์ฑ ๋๋ฌธ์ ์๋์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ๋ฐ๋ฉ์ด ๋๊ณ , ๊ฒฐ๊ณผ์ ์ผ๋ก ๋ณ๋ช ๋ง ๋จ๊ฒ ๋๋ค.
- ๊ทธ๋ ๊ธฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๋ค.
- ์ด๋ ๊ฒ ์ฐธ์กฐ๋ง ์กด์ฌํ๊ณ ์ฐธ์กฐํ๋ ๊ฒ ์ฌ๋ผ์ง ์ฐธ์กฐ์๋ฅผ Dangling reference๋ผ๊ณ ๋ถ๋ฅธ๋ค.
int& f() {
int x = 5;
return x; // ์ง์ญ๋ณ์ ์ฐธ์กฐ ๋ฆฌํด
}
int main() {
int x = f(); // ์ฐธ์กฐ๋ง ๋จ๊ณ ์ฐธ์กฐํ๋ ๋ณ์๋ ์ฌ๋ผ์ง
...
}
- ์ธ๋ถ ๋ณ์์ ๋ํ ์ฐธ์กฐ๋ฅผ ๋ฆฌํดํ๋ ๋ฐฉ์์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ด์ฐฎ๋ค.
- ์ฐธ์กฐ์๋ฅผ ๋ฆฌํดํ ์ ์ฅ์ ์ ํจ์์ ์ธ์ ์ ๋ฌ์ด๋ ๋ฆฌํด ์, ๊ฐ ๋ณต์ฌ๊ฐ ์ด๋ฃจ์ด์ง๋ ์๊ฐ ์์๊ฐ ์๋ค.
int& f(int& x) {
x = 5;
return x;
}
int main() {
int x = 10;
int y = f(x); // x์ ๋ํ ์ฐธ์กฐ๋ฅผ ๋ฆฌํด๋ฐ์
...
}
- ์ฐธ์กฐ์๊ฐ ์๋ ๊ฐ์ ๋ฆฌํดํ๋ ํจ์๋ฅผ ์ฐธ์กฐ์๋ก ๋ฐ์ ๊ฒฝ์ฐ, const ์ฐธ์กฐ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ผ๋ฉด ๊ฐ๋ฅํ๋ค.
- C++์์ ์์ธ ๊ท์น์ผ๋ก, ์์ ์ฐธ์กฐ์๋ก ๋ฆฌํด๊ฐ์ ๋ฐ๊ฒ ๋๋ฉด ํด๋น ๋ฆฌํด๊ฐ์ ์๋ช ์ด ์ฐ์ฅ๋๋ค.
- ์ฐ์ฅ๋๋ ๊ธฐ๊ฐ์ ์ฐธ์กฐ์๊ฐ ์ฌ๋ผ์ง ๋๊น์ง
int f() {
int x = 5;
return x;
}
int main() {
// int& y = f(); Dangling reference
const int& y = f(); // ๊ฐ๋ฅ
...
}
728x90
๋ฐ์ํ