본문 바로가기

Software/C++

C++ 참조변수-1

오늘은 참조변수에 대해서 알아보겠습니다.

변수를 만든다는것은  Memory를 잡는다는거죠. 하지만 아닌경우도 있습니다.


int a = 10;  // 변수선언을 했네요. Memory를 할당하는거죠.

int* b = &a; // Pointer변수를 선언했네요.  Pointer를 Memory 에 할당했습니다.

int& r = a  // C++에서는 참조라는것도 있습니다. 기존  변수(Memory)에 별명입니다. 

r =20; 을 수행하면 a에 20이 저장되죠. 


참조는 기존 Memory에 별명이기 때문에 대부분 Memory를 사용하지 않치만. 

일부 컴파일러나 복잡한 Code에서는  Pointer Memory를 사용할 수 있습니다.


아래와 같은 경우는 어떻게 될까요?.  Call by value, Call by Pointer도 아니네요.

void inc(int& r) {++r;}

호출 할때 inc(c) inc(&c) 어떤게 맞을까요.? int(c)가 맞습니다. 이것을 C++에서는 Call by reference라고 합니다. 

변수 c는 값이 변경됩니다.  inc(c)는 값이 변경되지 않을것 같은 호출인데 c값은 변경됩니다. 

가독성이 좋치 않습니다. 


아래경우에  Call by reference가 사용됩니다. 

아래와 같은 struct를 함수간사용한다고 하고, 값이 변경되지 않는다고 생각하면

아래와 같이 호출하게 됩니다.  문제는 이렇게 호출하면 value를 전달하기 위해서

Memory사용량이 크다는 것입니다.

struct Data

{temp[10000];};


void test(Data x)

{ }


int main()

{

 test(data)

}


하지만 아래와 같이 Call by reperence를 쓰면 호출할는쪽에서도 값 변경이 없을거라는 가독성도 확보되며, 전달시 memory사용량도 

줄일 수있습니다. 

주의: primitive type같은 경우에는 그냥 Call by value가 더 좋은거죠. Primitive경우에는 value가 pointer보다 최적화에 더 유리합니다.


struct Data

{temp[10000];};


void test(const Data& x)

{ }


int main()

{

 test(data)

}


참조변수는 값을 쉽게 바꾸기 위한것인데 결국 값을 바꾸지 못하는 상황을 위해 사용되었네요.. :)

 

' Software > C++' 카테고리의 다른 글

C++ 스마트포인터 참조금지, 대입금지  (0) 2016.08.21
C++ Smart Pointer 참조계수 기반  (0) 2016.08.21
C++참조변수-2  (0) 2016.07.30