반응형
Notice
Recent Posts
Recent Comments
Link
DNF LOVE
함수 호출> Call By Reference 와 Call By Value에 대한 차이점과 설명 본문
반응형
함수, 변수를 호출할 때 보통 Call By Reference 혹은 Call By Value에 대해 설명을 들었을 것이다.
이 둘의 정확한 설명과 차이점은 무엇인지 이번 포스터에서 다뤄보도록 하겠다.
1. Call By Value(값에 의한 호출)
- 함수가 호출 될때, 메모리 공간 안에서 함수를 위한 공간이 생성이 되며 함수가 종료되면 해당 공간은 사라진다.
- Call-By-Value는 값에 의한 호출 방식으로, 함수 호출 시 전달되는 변수의 값을 복사하여 함수의 인자로 전달한다.
- 복사된 인자는 함수 안에서 지역변수로 사용된다. 따라서 함수 안에서 인자의 값이 변경되어도, 외부의 변수의 값은 변경되지 않는다.
** Stack Frame : C++의 경우 서브루틴(함수)가 호출되면 할당되는 메모리 블록이다. (자료구조라 생각하면 편하다.)
#include <iostream>
using namespace std;
void call_by_value(int value1, int value2) {
// 서브루틴 안에서 값 변환
value1 = 100;
value2 = 200;
}
int main()
{
int value1 = 10;
int value2 = 20;
cout << "함수 호출되기 전 데이터 값" << endl;
cout << value1 << " " << value2 << endl;
call_by_value(value1, value2);
cout << "함수 호출되고 난 후 데이터 값" << endl;
cout << value1 << " " << value2 << endl;
return 0;
}
Call By Value는 값에 의해 인자를 복사해서 함수를 호출하기 때문에 넘겨진 파라미터 인자 값은 호출된 함수 내에서 지역변수로 사용되기 때문에 함수 내에서 값을 변해도 공유되지 않는다.
2. Call By Reference(참조에 의한 호출)
- 함수가 호출될 떄, 메모리 공간 안에서 함수를 위한 별도의 임시 공간이 생성이 되며 함수가 종료되면 해당 공간은 사라지게 된다.
- 참조에 의한 호출 방식은 함수 호출 시 인자로 전달되는 변수의 레퍼런스를 전달한다. 즉, 해당 변수의 메모리를 가르키게 된다.
- 함수 안에서 인자 값이 변경되면, 매개변수로 전달된 값도 함께 변경된다.
#include "pch.h"
#include <iostream>
using namespace std;
void call_by_reference(int *value1, int *value2) {
*value1 = 100;
*value2 = 200;
}
int main()
{
int value1 = 10;
int value2 = 20;
cout << "함수 호출되기 전 데이터 값" << endl;
cout << value1 << " " << value2 << endl;
call_by_reference(&value1, &value2);
cout << "함수 호출되고 난 후 데이터 값" << endl;
cout << value1 << " " << value2 << endl;
return 0;
}
참조에 의한 호출은 함수를 호출 할 때, 넘겨지는 파라미터 값은 포인터 변수이며 포인터는 해당 데이터의 메모리 값을 참조하기 때문에 포인터 변수가 가리키는 메모리 주소의 데이터를 변경시키면 이를 할당하고 있는 변수도 함께 바뀐다.
반응형
'Programming > C++' 카테고리의 다른 글
C++ 문법> String to char, char to String 형변환 (0) | 2019.10.23 |
---|---|
c++> int to string(int -> string), string to int(string -> int) 형변환 (0) | 2019.10.23 |
c++의 형변환(Typecasting) 몇 가지(reinterpret_cast, static_cast) (0) | 2019.10.23 |
C++에서 <algorithm>을 사용하여 정렬을 해보도록 하자. (0) | 2019.10.23 |
C/C++ Pointer 개념과 실행 예제 (0) | 2019.10.22 |