Language/C++

[C++] ํฌ์ธํ„ฐ์™€ ์ฐธ์กฐ์ž

soyw906 2023. 3. 27. 22:13

๐Ÿ“ ํฌ์ธํ„ฐ๋ž€?

๋ฉ”๋ชจ๋ฆฌ์˜ "์ฃผ์†Œ๊ฐ’"์„ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜

๋ณ€์ˆ˜๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ ๊ณต๊ฐ„์ด๋ผ๋ฉด, ํฌ์ธํ„ฐ๋Š” ๊ทธ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ณ€์ˆ˜๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ณ€์ˆ˜ ์•ž์— *์„ ๋ถ™์—ฌ์„œ ์„ ์–ธํ•œ๋‹ค.

 

โ–ถ ๊ทธ๋ ‡๋‹ค๋ฉด, ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ?

๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ์ด๋‚˜ ํŒŒ์ผ์—์„œ ์ฐธ์กฐ ์‹œ, ๋ณต์‚ฌ๋ณธ์ด ์•„๋‹Œ ์ง„์งœ ํ•ด๋‹น ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•จ.
์ฃผ์†Œ ์—ฐ์‚ฐ์ž & : ๋ณ€์ˆ˜์˜ ์ฃผ์†Œ๊ฐ’ ๋ฐ˜ํ™˜ ( = ์—ฐ์‚ฐ์ž ๋’ค์— ์“ฐ์ž„. ๋ณ€์ˆ˜ ์ด๋ฆ„ ๋’ค์— ์‚ฌ์šฉ๋จ )
ํฌ์ธํ„ฐ * : ๋ณ€์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ด (&๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ๋ณ€์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Œ)
์—ญ์ฐธ์กฐ * : ํฌ์ธํ„ฐ ๋ณ€์ˆ˜๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์†Œ์— ์žˆ๋Š” ๊ฐ’์„ ๊ฐ€์ ธ์˜ด

int i๋ฅผ ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์คฌ์„ ๋•Œ, ์‹ค์ œ i ์— ์ ‘๊ทผํ•˜์—ฌ ๊ฐ’ ๊ฐ€์ ธ์˜ค์ง€ ์•Š๊ณ , ๋ณต์‚ฌํ•˜์—ฌ ์—ฐ์‚ฐํ•จ.

๋”ฐ๋ผ์„œ ํฌ์ธํ„ฐ๋ฅผ ์ด์šฉํ•ด ๋ณ€์ˆ˜์˜ ์ฃผ์†Œ์— ์ง์ ‘ ์ ‘๊ทผํ•˜์—ฌ ์ง„์งœ ํ•ด๋‹น ๋ณ€์ˆ˜์— ์ ‘๊ทผ

/* ์ฃผ์†Œ ์—ฐ์‚ฐ์ž &์™€ ํฌ์ธํ„ฐ์˜ ์“ฐ์ž„ */
int a = 5;
int* b = &a // b: a์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ

ํฌ์ธํ„ฐ ํƒ€์ž… ๋ณ€์ˆ˜๋Š” ๋ณ€์ˆ˜ ์ž์ฒด์˜ ๊ฐ’์„ ์ˆ˜์ •ํ•œ๋‹ค๊ณ  ํ•˜์—ฌ ์›๋ž˜ ๊ฐ’๋„ ์ˆ˜์ •๋˜์ง€ ์•Š๋Š”๋‹ค.

ํฌ์ธํ„ฐ ํƒ€์ž…์˜ ๋ณ€์ˆ˜๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ณณ๊นŒ์ง€ * ๋ฅผ ์ด์šฉํ•˜์—ฌ ์—ญ์ฐธ์กฐ(dereference)ํ•˜์—ฌ์•ผ ์›๋ž˜ ๊ฐ’์ด ์ˆ˜์ •๋œ๋‹ค.

/* ์˜ˆ์‹œ */

int a = 7;
int* b = &a; // a์˜ ์ฃผ์†Œ๋ฅผ b์— ์ €์žฅ
b = 10; // a๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด, ์—ฌ์ „ํžˆ 7์ด๋‹ค. ์ฆ‰, b์˜ ๊ฐ’์„ ์ˆ˜์ •ํ•œ๋‹ค๊ณ  ํ•˜์—ฌ a์— ๋ณ€ํ™” x

int* b = a;
(*b) = 10; // a๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด 10์œผ๋กœ ๊ฐ’์ด ๋ณ€ํ•จ.

 

๐Ÿ“ ์ฐธ์กฐ์ž๋ž€?

๋ณ€์ˆ˜์˜ ๋ณ„์นญ(alias)๊ณผ ๊ฐ™์€ ์กด์žฌ. ๋ณ€์ˆ˜์˜ ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜๋ฅผ ์ง์ ‘ ์ฐธ์กฐ

ํฌ์ธํ„ฐ์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ, NULL ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์—†๊ณ , ์„ ์–ธ๊ณผ ๋™์‹œ์— ์ฐธ์กฐํ•  ๋ณ€์ˆ˜๋ฅผ ๋ฐ˜๋“œ์‹œ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค.

๋˜ํ•œ, ํ•œ ๋ฒˆ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ–ˆ๋‹ค๋ฉด, ์ดํ›„ ๋‹ค๋ฅธ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๋‹ค.

 

โ–ถ ๊ทธ๋ ‡๋‹ค๋ฉด, ์ฐธ์กฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ?

ํ•จ์ˆ˜์˜ ํ˜•์‹ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋“ฑ์— ์‚ฌ์šฉํ•˜์—ฌ ๋ณต์‚ฌ๋ณธ์ด ์•„๋‹Œ, ์›๋ณธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ–๊ณ  ์ž‘์—…ํ•˜๊ธฐ ์œ„ํ•จ

๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ค์–ด์„œ ์ƒ๊ธฐ๋Š” ์˜ค๋ฒ„ํ—ค๋“œ ๋˜ํ•œ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฆ‰, ์ฐธ์กฐ ๋ณ€์ˆ˜ =  ํ•ด๋‹น ๋ณ€์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ ์ง์ ‘ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋‹ค๋ฅธ ์ด๋ฆ„์˜ ๋ณ€์ˆ˜

์ฐธ์กฐ ์—ฐ์‚ฐ์ž & : ์™ผ์ชฝ์˜ ๋ณ€์ˆ˜๊ฐ€ ์˜ค๋ฅธ์ชฝ์˜ ๋ณ„๋ช…์ž„์„ ๋‚˜ํƒ€๋ƒ„. ( = ์—ฐ์‚ฐ์ž ์™ผ์ชฝ์— ์“ฐ์ž„ )

์›๋ณธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์ž‘์—…ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ฐธ์กฐ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ์ˆ˜์ •ํ•˜๋ฉด ์›๋ณธ ๋ณ€์ˆ˜์˜ ๊ฐ’ ๋˜ํ•œ ๋ณ€ํ•œ๋‹ค.

int a = 7;
int& b = a; // b๋Š” a์˜ ๋ณ„๋ช…์ด๋ผ ํ•  ์ˆ˜ ์žˆ๋‹ค.
b = 5; // a๋ฅผ ์ถœ๋ ฅํ•ด๋ณด๋ฉด a๋„ 5๊ฐ€ ๋˜์–ด, b๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด a๋„ ์ˆ˜์ •๋จ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

๋ณ„๋ช…๊ณผ ๊ฐ™์€ ์กด์žฌ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ ์ƒ์— ๊ณต๊ฐ„์ด ํ• ๋‹น๋˜์ง€ ์•Š๋Š”๋‹ค.

 

โ–ถ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ฐธ์กฐ์ž

#include <iostream>

using namespace std;

int change_val(int &p) { // int& p = number์™€ ๋งˆ์ฐฌ๊ฐ€์ง€
  p = 3;

  return 0;
}
int main() {
  int number = 5;

  cout << number << endl; // ์ถœ๋ ฅ ๊ฒฐ๊ณผ number = 5
  change_val(number);
  cout << number << endl; // ์ถœ๋ ฅ ๊ฒฐ๊ณผ number = 3 (๋ฐ”๋€Œ์–ด์žˆ์Œ)
}

 

โ–ถ ์ƒ์ˆ˜์— ๋Œ€ํ•œ ์ฐธ์กฐ์ž

#include <iostream>

using namespace std;

int main() {
  //int &ref = 4;
  /* Error !
  	ref = 5; ๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง€๊ธฐ ๋•Œ๋ฌธ.
    ๋”ฐ๋ผ์„œ ์ƒ์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด const๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์•ผ ํ•œ๋‹ค. */
    
  const int& ref = 4;
  int a = ref;

  cout << a << endl; // ์ถœ๋ ฅ ๊ฒฐ๊ณผ a: 4
}

 

โ–ถ ๋ ˆํผ๋Ÿฐ์Šค์˜ ๋ฐฐ์—ด & ๋ฐฐ์—ด์˜ ๋ ˆํผ๋Ÿฐ์Šค

๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋งํ•˜์ž๋ฉด ์ „์ž๋Š” ๋ถˆ๊ฐ€ํ•˜๋‚˜, ํ›„์ž๋Š” ๊ฐ€๋Šฅํ•˜๋‹ค.

C++ ์ƒ์—์„œ ๋ฐฐ์—ด arr์„ ์„ ์–ธ ์‹œ, ๋ฐฐ์—ด์˜ ์ด๋ฆ„ arr์€ ์ฒซ ๋ฒˆ์งธ ์›์†Œ์˜ ์ฃผ์†Œ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ ๊ฐ€๋Šฅํ•˜์—ฌ์•ผ ํ•œ๋‹ค.
ex) arr[1]๊ณผ *(arr+1)์ด ์„œ๋กœ ๋ฐ”๋€Œ์–ด์„œ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ
>> ๋ฉ”๋ชจ๋ฆฌ ์ƒ์—์„œ ํ•ด๋‹น ์›์†Œ๊ฐ€ ์กด์žฌํ•จ์„ ์˜๋ฏธ

๊ทธ๋Ÿฌ๋‚˜ ์ฐธ์กฐ์ž๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ƒ์— ์กด์žฌํ•˜์ง€ ์•Š์•„ ๊ณต๊ฐ„์„ ์ฐจ์ง€ X

๋ฐฐ์—ด์˜ ๋ ˆํผ๋Ÿฐ์Šค๋Š” ๊ฐ€๋Šฅํ•˜๋‹ค.

int arr[3] = {1, 2, 3};
int(&ref)[3] = arr;