본문 바로가기

C

([C언어] 16강) Call by value와 Call by reference

포인터를 배우면 꼭 배우는 개념이 바로

콜 바이 벨류 (Call by value)와

콜 바이 레퍼런스 (Call by reference)입니다

 

이 두 가지에 대해 배워보겠습니다.

 

자 우선 아래 코드를 보시죠

 

#include <stdio.h>

void Test(int n)
{
    n = 34;
}

int main()
{
    int a = 0;
    Test(a);
    
    printf("%d",a);
}

자 이 코드의 수행 결과는 뭘까요?

34가 출력될까요?

아니요, 0이출력됩니다.

왜냐하면 Test함수에 넘겨주는 매개변수는

'값'을 넘겨주는 것이기 때문입니다

변수 a 자체를 넘겨주는 게 아니라 변수 a의 값인 0을

Test의 n변수에 할당해주는 것이기 때문에 저 코드를 수행해도

a의 값은 변하지 않고 printf함수에 의해 0이 출력됩니다.

 

이를 값, 즉 value를 사용해 호출한다 라고 해서 Call by value 콜 바이 벨류라고 부릅니다.

 

 

하지만 여기에 포인터 개념을 추가해서 바꿀 수가 있습니다

 

아래 코드를 보시죠!

 

#include <stdio.h>

void Test(int * n)
{
    *n = 34;
}

int main()
{
    int a = 0;
    Test(&a);
    
    printf("%d",a);
}

자 이 코드는 수행하면 어떻게 될까요?

Test함수의 매개변수로 a의 주소 값을 주고 있습니다.

즉 Test함수의 n변수에는 a의 주소 값이 할당된다는 거죠

그리고 Test함수의 코드에서 n의 값 부분에 접근하여 34로 바꿔주니

메인 함수의 a의 주소에 접근하여 값을 34로 바꾼 것이고

위와 같은 코드는 a가 34로 바뀐 채 화면에 출력하게 됩니다.

 

이를 참조, 즉 reference를 사용해 호출한다!라고 해서 Call by reference 콜 바이 레퍼런스라고 부릅니다!

 

 

변수를 예를 들어 쉽게 설명하자면

 

int a = 0;
int b = a;
b = 3;

이렇게 한다고 a가 3으로 변하지 않지만

 

int a = 0;
int * b = &a;

*b = 30;

이렇게 하면 a의 값이 변하겠죠

 

위가 Call by value이고

아래가 Call by reference라고 생각하시면 됩니다!

 

 

매우 중요한 내용이니 꼭 외우시길 바라고

 

오늘 강좌는 여기에서 마치도록 하겠습니다

 

수고하셨습니다!