<C++ study>

[C++]참조자를 이용한 Call-by-Reference

gosoeungduk 2019. 2. 18. 02:33
반응형

그냥 개인공부 끄적끄적글


C++ 에서는 함수에서 외부 선언 된 변수의 접근 방식이 두 가지가 있는데

하나는 주소값(포인터)을 이용하는 것

두 번째는 참조자(&)를 이용하는 것이다.


그리고 이 인자들을 어떻게 사용하느냐에 따라서

Call-by-Value 와 Call-by-Reference가 갈린다.


간단하다. 인자를 참조하여서 값을 건드는 경우와 그냥 메모리 주소를 이용하는 것.


전자는 Call-by-Reference이고 후자는 Call-by-Value가 된다.


예제로 공부하였다.


#include<iostream>

#include<cstring>

#include<cstdlib>

#include<cstdio>

using namespace std;

void SwapPointer(int *(&ref1), int *(&ref2))

{

cout << "ref1 주소: " << ref1 << endl;

int *tmp;

tmp = ref2;  //ptr1참조

cout << "ref2 주소: " << ref2 << endl;

ref2 = ref1;

cout << "ref2 주소: " << ref1 << endl;

ref1 = tmp;

cout << "ref1 주소: " << ref1 << endl;

}

int main()

{

int num1 = 5;

int *ptr1 = &num1;

int num2 = 10;

int *ptr2 = &num2;

cout <<"num1 주소: "<< ptr1 << endl;

cout << "num2 주소: " << ptr2 << endl;

SwapPointer(ptr1, ptr2);

cout << *ptr1 << endl;

cout << *ptr2 << endl;


포인터를 인자로 받아서 각 포인터가 서로를 바꿔서 가리키도록 하는 소스코드이다.


위와 같은 경우에는 참조자를 인자로 받아서 ptr1 값(num1 변수 주소), ptr2 값(num2 변수 주소)을 참조하기 때문에


Call-by-Reference 방식이며, 의도한대로 포인터가 잘 바뀔 것이다.


하지만 밑을 보자.


#include<iostream>

#include<cstring>

#include<cstdlib>

#include<cstdio>

using namespace std;


void SwapPointer(int *ref1, int *ref2)

{

int *tmp;

cout << "ref1 주소: " << ref1 << endl;

tmp = ref2;

cout << "ref2 주소: " << ref2 << endl;

ref2 = ref1;

cout << "ref2 주소: " << ref2 << endl;

ref1 = tmp;

cout << "ref1 주소: " << ref1 << endl;

}

int main()

{

int num1 = 5;

int *ptr1 = &num1;

int num2 = 10;

int *ptr2 = &num2;

cout <<"num1 주소: "<< ptr1 << endl;

cout << "num2 주소: " << ptr2 << endl;

SwapPointer(ptr1, ptr2);

cout << *ptr1 << endl;

cout << *ptr2 << endl;


위 소스코드는 단순히 주소값(포인터)을 전달받아서 서로 주소값만 바꿔주는 행위가 있었기에


Call-by-Value 이며, 가리키는 값은 변하지 않는다.



[Call-by-Value 형태의 실행결과]


함수내부에서는 변했지만 main함수에서는 변하지 않았음을 알 수 있다.



추가적으로 함수에서 참조자를 사용하는 경우 문제에 대해서 숙지해보자.

우선 소스분석 시에 함수 원형을 파악 후, 함수 몸체까지 문장단위로 확인해야하는 번거로운 과정을 거쳐야한다.


이를 방지하기 위해서 참조자 매개변수가 값을 바꾸거나 하지않는 경우 const를 붙여서 

변경 여지를 없애야한다.


반응형