C++

C++ Call by Value와 Call by Reference의 차이

김구티2 2024. 4. 1. 19:20

1. 함수의 호출 방식 2가지

함수는 값에 의한 호출 또는 참조에 의한 호출의 두 가지 방식으로 호출될 수 있다. 이 두 가지 방식은 일반적으로 매개변수로 전달되는 값의 유형에 따라 구분된다. 함수에 전달되는 매개 변수를 실제 매개 변수라고 하고, 함수에 의해 수신되는 매개 변수를 형식 매개 변수라고 한다.

2. Call by Value(값에 의한 호출)

매개변수 전달의 값 메서드에 의한 호출에서 실제 매개변수의 값은 함수의 형식 매개변수에 복사된다.

서로 다른 메모리 위치에 저장된 두 개의 매개변수 복사본이 있다. 하나는 original copy고 다른 하나는 function copy다. 함수 내부에서 변경된 내용은 발신자의 실제 매개변수에 반영되지 않는다.

 

Call by Value 예시:

// C program to illustrate call by value
#include <stdio.h>

// Function Prototype
void swapx(int x, int y);

// Main function
int main()
{
     int a = 10, b = 20;

     // Pass by Values
     swapx(a, b); // Actual Parameters

     printf("In the Caller:\na = %d b = %d\n", a, b);

     return 0;
}

// Swap functions that swaps
// two values
void swapx(int x, int y) // Formal Parameters
{
     int t;

     t = x;
     x = y;
     y = t;

     printf("Inside Function:\nx = %d y = %d\n", x, y);
}

 

출력:

Inside Function:
x = 20 y = 10
In the Caller:
a = 10 b = 20

 

출력에서 알 수 있듯, 함수에서 x와 y의 값을 교환한 후에도 실제 a와 b의 값은 변하지 않는다.

3. Call by Reference

매개변수 통과의 참조 방법에 의한 호출에서, 실제 매개변수의 주소는 형식 매개변수로서 함수에 전달된다. C에서, 우리는 참조에 의한 호출을 달성하기 위해 포인터를 사용한다.

실제 매개변수와 포말 매개변수는 모두 동일한 위치를 나타낸다. 함수 내부에서 이루어진 모든 변경 사항은 실제로 발신자의 실제 매개 변수에 반영된다.

 

Call by Reference 예시:

// C program to illustrate Call by Reference
#include <stdio.h>

// Function Prototype
void swapx(int*, int*);

// Main function
int main()
{
     int a = 10, b = 20;

     // Pass reference
     swapx(&a, &b); // Actual Parameters

     printf("Inside the Caller:\na = %d b = %d\n", a, b);

     return 0;
}

// Function to swap two variables
// by references
void swapx(int* x, int* y) // Formal Parameters
{
     int t;

     t = *x;
     *x = *y;
     *y = t;

     printf("Inside the Function:\nx = %d y = %d\n", *x, *y);
}

 

출력:

Inside the Function:
x = 20 y = 10
Inside the Caller:
a = 20 b = 10

 

a와 b의 실제 값은 x와 y의 값을 교환한 후 바뀌는 것을 알 수 있다.

4. Call by Value vs Call by Reference

Call by Value Call by Reference
함수를 호출하는 동안 변수 값을 함수에 전달한다. 이러한 함수를 Call by Value라 한다. 함수를 호출하는 동안 변수 값을 전달하는 대신, 변수 주소를 Call by Reference로 알려진 함수에 전달한다.
호출 함수의 각 변수 값이 호출 함수의 해당 더미 변수로 복사된다. 호출 함수의 실제 변수 주소가 호출 함수의 더미 변수에 복사된다.
호출 함수의 더미 변수에 대한 변경사항은 호출 함수의 실제 변수 값에 영향을 미치지 않는다. 주소를 사용하여 실제 변수에 엑세스할 수 있으므로 이를 조작할 수 있다.
호출 단위의 값에서는 함수 호출을 통해 실제 변수의 값을 변경할 수 없다. 호출 시 함수 호출을 통해 변수 값을 변경할 수 있다.
변수 값은 단순한 기법으로 전달된다. 변수의 주소 값을 저장하려면 포인터 변수가 필요하다.
변경되지 않아야 하는 작은 값을 전달할 때 선호된다. 많은 양의 데이터를 함수에 전달해야 할 때 선호된다.
원본 데이터가 보존됨에 따라 Call by Value가 더 안전한 것으로 간주된다. Call by Reference는 원본 데이터를 수정할 수 있으므로 위험할 수 있다.
728x90

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

C++ 재귀(Recursion) 총정리  (1) 2024.04.03
C++ 디폴트 인수(Default Arguments) 총정리  (0) 2024.04.02
C++ 매개변수 전달 총정리  (0) 2024.03.30
C++ return문 총정리  (0) 2024.03.17
C++ 함수(functions) 총정리  (0) 2024.03.16