Call by value와 Call by Reference의 차이
- 함수를 정의할 때 매개변수를 어떤 식으로 받고 사용하느냐의 따라서 Call by value와 Call by reference로 나뉩니다.
Call by value란?
- Call by value는 함수 매개변수의 형식을 값을 복사하는 형태로 정의한 것을 말합니다.
Call by value 예시
int Add(int num1, int num2)
{
return num1 + num2;
}
int main()
{
int num1 = 10;
int num2 = 20;
std::cout << Add(num1, num2);
return 1;
}
- 위 코드는
Add()
함수를 호출할 때 int 데이터 타입의 num1, num2의 값 자체를 복사하여 함수를 호출하고 있습니다.
Call by reference란?
- Call by reference는 함수 매개변수의 형식을 주소 값을 복사하는 형태로 정의한 것을 말합니다.
- Call by reference는 매개변수의 주소 값을 받기 때문에 함수 내부에서 값을 수정하였을 때 해당 함수를 호출 했을 때 전달한 인자의 값 또한 수정됩니다.
Call by reference 예시
int IncrementNumber(int *pNum)
{
return (*pNum)++;
}
int IncrementNumber(int &num)
{
return num++;
}
int main()
{
int num = 0;
IncrementNumber(&num);
IncrementNumber(num);
std::cout << num;
return 1;
}
- 위 코드는
IncrementNumber()
매개변수로 포인터 타입과 래퍼런스 타입을 받을 수 있는 형태로 오버로딩 되어있으며, 함수를 호출할 때 int 데이터 타입의 num의 주소값을 전달할하여 호출하고 있습니다.
Call by value vs Call by reference
- Call by value는 값을 복사하는 형태이기 때문에 데이터 타입의 따라서 복사하는 크기가 달라집니다. 하지만, Call by reference는 컴파일 환경이 32bit 또는 64bit냐의 따라서 4byte 혹은 8byte를 복사하기 때문에 매개변수 데이터 타입의 크기와 상관없이 복사 오버헤드가 고정적입니다.
Call by value를 사용해야 할 때
- 매개변수의 데이터 크기가 포인터 크기와 작거나 같고 함수 내부에서 값의 수정이 필요하지 않다면은 Call by value를 사용하는 것이 좋습니다.
그 이유는 해당 함수를 호출한 사용자가 해당 함수가 인자 값을 수정하지 않는 다는 것을 확실히 알 수 있기 때문입니다.
Call by reference를 사용해야 할 때
- 매개변수의 데이터 크기가 포인터보다 크고 함수 내부에서 값을 수정해야 한다면은 Call by reference를 사용하는 것이 좋습니다.
그 이유는 데이터 복사에 대한 오버헤드를 줄일 수 있고 함수 내부에서 매개변수의 값을 수정하여 외부에 영향을 줄 수 있기 때문입니다.
'개발 상식' 카테고리의 다른 글
URI, URL, URN 이란? (1) | 2022.10.29 |
---|---|
절대경로와 상대경로란? (0) | 2022.10.28 |
저급 언어/고급 언어 with 컴파일 언어/인터프리터 언어 (0) | 2022.10.26 |
문자열 인코딩과 디코딩이란? (0) | 2022.10.25 |
해시 ( Hash ) 란? with 해시 테이블 만들기 (0) | 2022.10.05 |