본문 바로가기
C++

[C++] call by value, call by address, call by reference 차이

by rehtorb_s 2020. 7. 21.

함수가 호출될 때 매개변수에 인자를 어떤 방식으로 넣어줄건지에 대한 개념이죠.
 
call by value : 값에 의한 전달
call by address : 주소에 의한 전달
call by reference : 참조에 의한 전달

 
1. call by value
 

 

더보기
//main
void CallByValue(int value)
{
	value = 20;
	std::cout << value << std::endl;	//value의 값
	std::cout << &value << std::endl;	//value의 주소
}

int main()
{
	int num = 10;
	CallByValue(num);
	std::cout << num << std::endl;	//num의 값
	std::cout << &num << std::endl;	//num의 주소

	return 0;
}

함수가 호출되면 int value = num 형태로 값의 복사가 이뤄집니다. (실제로 num을 대입시키는게 아니라 num이 가지는 값을 복사하고 임시로 메모리에 저장을 한 후 그 값을 value에 집어넣죠) 단 value와 num은 지역변수로서 각각 다른 주소값을 가집니다. 때문에 value 값을 바꿔도 num의 값은 바뀌지 않으며 함수가 종료되면 value는 사라지고, main이 종료되면 num도 사라집니다.
 
2. call by address
 

 

더보기
//main
void CallByAddress(int* address)
{
	*address = 20;
	std::cout << *address << std::endl;	//address가 가리키는 주소의 값
	std::cout << &address << std::endl;	//address의 주소
}
int main()
{
	int num = 10;
	CallByAddress(&num);
	std::cout << num << std::endl;	//num의 값
	std::cout << &num << std::endl;	//num의 주소

	return 0;
}

함수가 호출되면 int *address = &num 형태로 address가 num의 주소를 가리키고 있기 때문에 역참조 연산자 '*'로 num의 주소에 접근을 하고 값을 바꿔버리면 num의 값이 바뀌게 됩니다. 이번에도 address와 num은 서로 다른 주소에 할당이 되는데, 역시나 지역변수로서 함수, main문이 종료되면 사라지게 됩니다.
 
여기까지가 C에서 제공하는 기능들이고 C++에는 Call by reference 개념이 추가되었습니다. 
3. call by reference
 

 

더보기
//main
void CallByReference(int& reference)
{
	reference = 20;
	std::cout << reference << std::endl;	//reference가 가리키는 주소의 값
	std::cout << &reference << std::endl;	//reference의 주소
}
int main()
{
	int num = 10;
	CallByReference(num);
	std::cout << num << std::endl;	//num의 값
	std::cout << &num << std::endl;	//num의 주소

	return 0;
}

 
함수가 호출되면 매개변수로 선언된 reference는 num이 할당된 메모리를 공유하게 됩니다. "num을 함수안에서는 reference로 부르겠다" 라는 일종의 별명이죠. 때문에 값을 바꾸면 num의 값도 바뀌고 주소를 출력하면 같은 주소가 나옵니다. 
 
세가지의 차이점을 아시겠나요? 
 
한가지, call by address는 꽤 많은 논란이 있었습니다. c에서는 call by address가 주소를 넘겨주는 것 처럼 보이지만 사실 call by value 방식처럼 단순히 주소를 복사해서 주소라는 '값'을 메모리에 임시로 저장 후 인자로 넘기기 때문입니다. 때문에 call by address의 정체는 call by value이므로 c에는 call by address가 존재하지 않는다 라는 주장과 아닌 주장이 있었죠.
 
음.. 한번쯤 생각해볼만한 주제이긴 한데 C++의 reference 개념이 나온 이상 call by address는 값이 전달되는 call by value의 특성과, 주소에 해당되는 값을 바꿀 수 있는 call by reference의 특성을 동시에 가진 녀석이다 정도로만 그치시는게 좋을 것 같습니다. 단 call by address를 이용하는 포인터를 왜 쓰냐에 더 주목을 하는게 생산적이라고 생각합니다. 
 
 
아래글에 포인터를 사용하는 이유에 대해 서술했습니다. 참고하세요
https://rehtorb-algorithm.tistory.com/8?category=875014


포스팅 내용에 오류가 있거나 지적사항이 있다면 댓글로 달아주세요. 배움을 멈추지 않는 Good Programmer가 되겠습니다. 감사합니다.
 

댓글