๋ณธ๋ฌธ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ
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& xint& 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
๋ฐ˜์‘ํ˜•