Aliasing (Reference Variable)

๊ธฐ๋ณธ์ ์œผ๋กœ, ์šฐ๋ฆฌ๊ฐ€ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋ฅผ ๋‹ค๋ฅธ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๊ฒŒ ๋˜๋ฉด ์ด ๊ฐ’์„ ๋ณต์‚ฌํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ์…ˆ์ด ๋œ๋‹ค.

์ž‘์€ ๊ฐ’์˜ ๊ฒฝ์šฐ ๋ณต์‚ฌ๋ฅผ ํ•ด์„œ ํ”„๋กœ๊ทธ๋žจ์„ ์งœ๋Š” ๊ฒƒ์ด ๋ฌธ์ œ๊ฐ€ ์—†์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ตฌ์กฐ์ฒด๋‚˜ ๊ฐ์ฒด๊ฐ™์€ ๊ฒฝ์šฐ ๋ณต์‚ฌ๋ฅผ ํ•ด์„œ ์“ด๋‹ค๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.

๋˜ํ•œ, ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ๊ฐ’์„ ๊ทธ๋ƒฅ ๋„˜๊ฒจ์ค€๋‹ค๋ฉด, ๊ทธ ํ•จ์ˆ˜ ๋‚ด์—์„œ๋งŒ ์„ ์–ธ๋˜๋Š” ์ง€์—ญ๋ณ€์ˆ˜๋“ค๋งŒ ๊ฐ€์ง€๊ณ  ์žฅ๋‚œ์„ ์น˜๊ฒŒ๋˜์–ด, ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ, ์›๋ž˜ ๊ฐ’ ์ž์ฒด๋ฅผ ๊ฐ€์ง€๊ณ  ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ, ์ด ๋„์ถœ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๋Š” ๋‚ด๊ฐ€ ์ €์žฅํ•œ ๊ฐ’ ์ž์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ํ•„์š”์„ฑ์ด ์ƒ๊ธฐ๋Š”๋ฐ, C์—์„œ๋Š” ์ด๊ฑธย Pointerย ๋กœ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ–ˆ์—ˆ๋‹ค.

ํ•˜์ง€๋งŒ ํฌ์ธํ„ฐ์˜ ๋ฌธ์ œ์  ๋•Œ๋ฌธ์—, C++ ์€ ์ฐธ์กฐ๋ณ€์ˆ˜๋ผ๋Š” ์ƒˆ๋กœ์šด ๊ฐœ๋…์„ ๋„์ž…ํ•œ๋‹ค.

ํฌ์ธํ„ฐ์™€ ์ฐธ์กฐ๋ณ€์ˆ˜์˜ ์ฐจ์ด์ ๊ณผ ์žฅ๋‹จ์ ์€ ๋ฐ‘์—์„œ ๋‹ค๋ค„๋ณด๋„๋ก ํ•˜๊ณ , ์ง€๊ธˆ์€ ์ฐธ์กฐ๋ณ€์ˆ˜์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž.

int x = 3;
int &r = x;

๋ฐ‘์˜ย &rย ์ด ์ฐธ์กฐ ๋ณ€์ˆ˜์ด๋‹ค. ์ €๋ ‡๊ฒŒ ํ•  ๊ฒฝ์šฐ r์€ x๊ฐ€ ์ €์žฅ๋œ ๋ฉ”๋ชจ๋ฆฌ๊ณต๊ฐ„์„ ๋™์‹œ์— ๊ฐ€๋ฅดํ‚ค๋Š” ๋ณ€์ˆ˜์ด๋‹ค.

์ฆ‰, x๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” 3์˜ย ๋ณ„๋ช…ย ์ด ์ƒ๊ฒผ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

Example

#include <iostream>
 
int main(){
    int x = 5;
    int y = x;
    int &r = x;
    
    std::cout << "x = " << x << '\n';
    std::cout << "y = " << y << '\n';
    std::cout << "r = " << r << '\n';
    
    x = 7;
    
    std::cout << "---------------" << endl;
    std::cout << "x = " << x << '\n';
    std::cout << "y = " << y << '\n';
    std::cout << "r = " << r << '\n';
    
    return 0;
}
์ถœ๋ ฅ
// x = 5
// y = 5
// r = 5
// ---------------
// x = 7
// y = 5
// r = 7

x ๊ฐ’์„ ๋ฐ”๊ฟจ๋”๋‹ˆ, r์—๋Š” ๋ฐ”๋€ ๊ฐ’์ด ๋“ค์–ด๊ฐ„ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ y๋Š” 5๋ผ๋Š” ๊ฐ’์ด ๊ทธ๋Œ€๋กœ ๋“ค์–ด๊ฐ€ ์žˆ๋‹ค.

y๋Š” x๊ฐ’์„ ๋ณต์‚ฌํ•ด์„œ ๋ฉ”๋ชจ๋ฆฌ์— ๋„ฃ์€ ๊ฒƒ์ด๊ณ , r์€ x์˜ ๋ฉ”๋ชจ๋ฆฌ๊ณต๊ฐ„์„ ํ•จ๊ป˜ ๋œปํ•˜๊ณ  ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์—ฌ๋Ÿฌ ํ˜ผ๋ž€์ด ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

  1. C์—์„œ๋Š”ย &ย ๋Š” ์ €์žฅ๋œ ๊ฐ’์˜ ์ฃผ์†Œ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฐฉ๋ฒ•์ด์—ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์—ฌ๊ธฐ์„œ๋Š” ์ฐธ์กฐ๋ณ€์ˆ˜๋ผ๋Š” ๋‹ค๋ฅธ ์ด๋ฆ„์„ ๊ฐ€์ ธ๋‹ค๊ฐ€ ์“ฐ๊ณ  ์žˆ๋‹ค.
  2. ๊ฐ™์€ ๊ฐ’์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค๋Š” ์ ์—์„œ C์–ธ์–ด์—์„œ Pointer ๊ฐ€ ์ƒ๊ฐ๋‚ฌ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์• ๋งคํ•˜๊ฒŒ ๋‹ค๋ฅธ ์ ์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ค์ ์ด ๋‹ค๋ฅผ๊นŒ?

Comparision

์ฐธ์กฐ๋ณ€์ˆ˜๋Š” ๋‚ด๊ฐ€ ์„ ์–ธํ•œ ๊ฐ’์„ ๋™์‹œ์— ๊ฐ€๋ฆฌํ‚จ๋‹ค๋Š” ์ ์—์„œ ํฌ์ธํ„ฐ์™€ ์œ ์‚ฌํ•œ ์ธก๋ฉด์ด ์žˆ๋‹ค.

๋˜ ํ—ท๊ฐˆ๋ฆฌ๋Š” ์ ์€, C์—์„œ &์˜ ์‚ฌ์šฉ์€, ๋‚ด๊ฐ€ ์ €์žฅํ•œ ๋ณ€์ˆ˜์˜ ์ฃผ์†Œ๊ฐ’์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉํ–ˆ์—ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ C++์— ์™€์„œ๋Š” ์ด๋…€์„์„ ์ฐธ์กฐ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•˜๋‹ˆ ์—ฌ๊ฐ„ ํ˜ผ๋™์Šค๋Ÿฌ์šด๊ฒŒ ์•„๋‹ˆ๋‹ค.

Difference between Pointer & Reference Variable

C์—์„œ ํฌ์ธํ„ฐ๋Š” ์žฅ๋‹จ์ ์ด ์•„์ฃผ ๋ช…ํ™•ํ•˜๋‹ค.

  • ์žฅ์ ย : ๋ฉ”๋ชจ๋ฆฌ์— ์ง์ ‘์ ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋‹จ์ ย : ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ž์˜ ์„ ํƒ์ด ์ง€๋ฐฐ์ ์ด๋‹ค. ์ฆ‰, ์•„๋ฌด๋ ‡๊ฒŒ๋‚˜ ์ ‘๊ทผํ•˜์—ฌ ์ž˜๋ชป๋œ ์ฃผ์†Œ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์œ„ํ—˜์„ฑ์ด ์žˆ๋‹ค.

ํฌ์ธํ„ฐ์˜ ๋ฌธ์ œ์ ์€ ์„ ์–ธ๊ณผ ํ• ๋‹น์„ ๋‚˜๋ˆ„๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•œ๋‹ค.

#include <stdio.h>
 
int main(){
    int x;
    int *a;
    x = 4;
    *a = x;
    
    return 0;
}

์œ„์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์„ ์–ธ๊ณผ ํ• ๋‹น์„ ํ•ด์ค€๋‹ค.

์ด๋Ÿฐ์‹์œผ๋กœ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋งŒ์•ฝ ๋‚ด๊ฐ€ ์ด๊ฒƒ๋ณด๋‹ค ๋ณต์žกํ•œ ๊ตฌ์กฐ์—์„œ ํฌ์ธํ„ฐ๋ฅผ ์ž˜๋ชป์‚ฌ์šฉํ•œ๋‹ค๋ฉดย NULLย ๋˜๋Š”ย Garbageย ๊ฐ’์ด ๋“ค์–ด๊ฐˆ ์œ„ํ—˜์ด ์žˆ๋‹ค.

์ด๋Ÿฐ ๋‹จ์ ์„ ๋ณด์•ˆํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœย ์ฐธ์กฐ๋ณ€์ˆ˜ย ๊ฐ€ ๋งŒ๋“ค์–ด์กŒ๋‹ค.

#include <iostream>
 
int main(){
    int x = 4;
    int &r = x;
    
    return 0;
}

์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ

r์€ x๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋˜๋‹ค๋ฅธ ๋ณ„์นญ์ด ๋œ๋‹ค.

์ด๋Ÿฐ์‹์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. ์ฐธ์กฐ๋ณ€์ˆ˜๋Š” ํฌ์ธํ„ฐ์™€ ๋‹ค๋ฅด๊ฒŒ ์„ ์–ธ๊ณผ ํ• ๋‹น์ด ๋ถ„๋ฆฌ๋˜์–ด์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ณ , ๋™์‹œ์— ์ด๋ฃจ์–ด์ ธ์•ผ ํ•œ๋‹ค.

์ฆ‰,ย ์„ ์–ธ๊ณผ ์ดˆ๊ธฐํ™”๊ฐ€ ๋™์‹œ์— ์ด๋ฃจ์–ด์ง„๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ํฌ์ธํ„ฐ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ž˜๋ชป๋œ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฌธ์ œ์ ์ด ํ•ด๊ฒฐ๋œ๋‹ค.

Summary

Pointer

  • ์„ ์–ธ๊ณผ ํ• ๋‹น์ด ๋ถ„๋ฆฌ๋˜์–ด ์ด๋ฃจ์–ด์ง
  • ์ž์œ ๋กญ๊ฒŒ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ์œผ๋‚˜, ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜ ๋ฐœ์ƒํ™•๋ฅ ์ด ๋†’์Œ (Null ๊ฐ’)
  • ์„ ์–ธ๊ณผ ํ• ๋‹น์ด ๋ถ„๋ฆฌ๋˜๋‹ˆ, ํฌ์ธํ„ฐ ๋ณ€์ˆ˜์•ˆ์˜ ์ฃผ์†Œ๊ฐ’์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Œ
  • ํฌ์ธํ„ฐ ๋ณ€์ˆ˜์•ˆ์—๋Š” ํ•ด๋‹น ๊ฐ์ฒด์˜ ์ฃผ์†Œ๊ฐ’์ด ๋“ค์–ด๊ฐ€์žˆ์Œ
  • *ย ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์„ ์–ธํ•˜๊ณ  ์‚ฌ์šฉํ•จ

Reference Variable

  • ์„ ์–ธ๊ณผ ํ• ๋‹น์ด ๋™์‹œ์— ์ด๋ฃจ์–ด์ง
  • ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ํฌ์ธํ„ฐ์— ๋น„ํ•ด ์˜ค๋ฅ˜๊ฐ€ ๋‚  ํ™•๋ฅ ์ด ์ค„์–ด๋“ฆ
  • ๋˜ํ•œ ์„ ์–ธ๊ณผ ํ• ๋‹น์ดํ›„ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์—†์Œ
  • ์ฐธ์กฐ๋ณ€์ˆ˜๋Š”ย xย ๊ฐ’ ์ž์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ด
  • xย ์˜ ๋ณ„์นญ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋จ
  • &ย ์„ ์‚ฌ์šฉํ•ด์„œ ์„ ์–ธํ•˜๊ณ  ์‚ฌ์šฉํ•จ

์ฃผ์†Œ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” & ์™€ ์ฐธ์กฐ๋ณ€์ˆ˜์˜ &

C ์—์„œย scanf()ย ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ,ย &aย ์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ž…๋ ฅ์„ ๋ฐ›์•˜๋‹ค.

์ด ๋•Œ, &๋Š” ๋ณ€์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์ƒ๊ฐํ•˜๊ณ  ์‚ฌ์šฉํ–ˆ์—ˆ๋‹ค.

๊ฐ™์€ &๋ฅผ ์“ฐ๋ฉด์„œ ์™œ ํ•˜๋‚˜๋Š” ์ฃผ์†Œ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ, ๋˜ ์ฐธ์กฐ๋ณ€์ˆ˜๋ผ๊ณ  ๋‹ค๋ฅด๊ฒŒ ์–˜๊ธฐํ•˜๋Š” ๊ฑธ๊นŒ?

์‚ฌ์šฉ๋ฒ•์€ 2๊ฐ€์ง€๊ฐ€ ์žˆ๋Š”๋ฐ, ๊ตฌ์ฒด์ ์œผ๋กœ ์•Œ์•„๋ณด๋ฉด ๊ต‰์žฅํžˆ ๊ฐ„๋‹จํ•จ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ฐจ๋ก€์ฐจ๋ก€ ์•Œ์•„๋ณด์ž.

์ฃผ์†Œ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” &

#include <stdio.h>
 
int main(){
    int x;
    int *a;
    
    a = &x;
    
    return 0;
}

์ด ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด,ย aย ๋Š”ย xย ์˜ ์ฃผ์†Œ๋ฅผ ๋ฐ›์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ &์€ ์ฐธ์กฐ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹ˆ๊ณ  x์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

"="ย ์—ฐ์‚ฐ์ž์˜ย ์˜ค๋ฅธ์ชฝย ์— ์žˆ๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•˜์ž.

์ฐธ์กฐ๋ณ€์ˆ˜ &

#include <iostream>
 
int main(){
    int x = 4;
    int &a = x;
    
    return 0;
}

c++ ์—์„œ ์ฐธ์กฐ๋ณ€์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ ์–ธ๊ณผ ์ดˆ๊ธฐํ™”๋ฅผ ํ•œ๋‹ค.

์ด๋•Œ &๋Š”ย =ย ์—ฐ์‚ฐ์žย ์™ผ์ชฝย ์— ์žˆ๋‹ค.

Summary

๊ฒฐ๊ตญ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ & ๋Š”ย ์˜ค๋ฅธ์ชฝ ์ฐธ์กฐ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š”ย ์™ผ์ชฝย ์— ์žˆ๋‹ค.