값에 의한 호출 (Call by Value), 참조에 의한 호출 (Call by Reference)
반응형

함수의 파라미터에 값을 넘기는 방법에는 값에 의한 호출 (call by value) 그리고 참조에 의한 호출 (call by reference)가 있습니다.

값에 의한 호출 (Call by Value)

값에 의한 호출(Call by Value)이란 호출 시 넘긴 값을 복사하여 함수의 매개변수에 넣어 사용하는 방법입니다. 즉 함수 호출부와 호출된 함수에서 사용된 변수와 넘긴 값은 각기 다른 변수로 취급됩니다.

#include 

void calc(int x); 

int main() 
{ 
    int x = 10; 
    calc(x); 
    // 지역 변수 x의 값을 출력합니다. 
    printf("main 함수에서 x의 값은 %d", x); 
    return 0; 
} 

void calc(int x) 
{ 
    // 파라미터로 받은 x의 값에 10을 더합니다. 
    x = x + 10 ; 
    printf("calc 함수에서 x의 값은 %d ", x); 
} 

OUTPUT 
main 함수에서 x의 값은 10 
calc 함수에서 x의 값은 20 

main 함수에서 정의한 x 변수와 calc 함수의 x 매개변수는 이름만 같을 뿐 서로 다른 메모리 영역에 값을 가지고 있습니다.

위의 코드는 main 함수에서 변수 x를 선언하고 10으로 초기화 하였습니다. 그리고 calc 함수의 인수값으로 넘겨줍니다. calc 함수가 그 값을 받을 때 10이라는 값은 복사되어 매개변수로 복사됩니다.  그리고 함수내에서 10을 더하여 calc 값을 출력하고 main() 함수로 돌아와 x의 값을 출력합니다.

즉 main 함수와 calc 함수에서 사용된 각각의 x 변수는 서로 다른 값을 가지고 있는 변수가 됩니다.

만약 main 함수 내의 변수 x에 calc 함수의 결과값을 저장하기 위해서는 아래와 같이 calc함수의 리턴값을 x 변수에 넣으면 됩니다.

#include 

int calc(int x); 

int main() 
{ 
    int x = 10; 
    x = calc(x); 
    printf("x의 값은 %d", x); 
    return 0; 
} 

int calc(int x) 
{ 
    x = x + 10 ; 
    return x; 
} 

OUTPUT 
x의 값은 20 

참조에 의한 호출을 설명하기에 앞서 변수에 대한 개념을 다시 한번 짚고 넘어가겠습니다. 변수명은 값이 저장된 메모리 주소의 이름입니다. 변수가 선언, 초기화 되면 메모리상에 공간이 할당되고 값이 저장됩니다. 변수명은 복잡한 메모리 주소명 대신 사용되는 이름입니다.

참조에 의한 호출 (Call by Reference)

참조에 의한 호출(Call by Reference)이란 값을 넘기는 대신 값이 저장된 메모리 주소를 함수에 넘겨주는 방법입니다.  함수 호출시 인수에  “&변수명” 형식으로 변수의 주소값을 넘길수 있습니다. 또한 호출된 함수에서 “*변수명” 형식으로 주소값을 받을 수 있게됩니다.

여기서 사용된 &, *는 특수 연산자입니다. [5편, 연산자]편의 특수 연산자(Special operators) 항목을 참고하시기 바랍니다. 이렇게 값 대신에 주소 값을 주고받은 변수는 결국 값이 저장된 같은 메모리 주소를 가리키게 됩니다.

#include 

void calc(int *p);  // 아규먼트로 포인터 변수 *p를 가지고 있는 함수 선언 

int main() 
{ 
    int x = 10; 
    calc(&x);       // x의 주소값을 함수로 전달 
    printf("x변수의 값은 %d", x); 
    return(0); 
} 

void calc(int *p)   // 주소 값을 포인터 변수로 받음 
{ 
    /* 
        p와 main함수의 x는 결국 같은 변수 공간을 가르킴 
    */ 
    *p = *p + 10;  
} 

OUTPUT 
x변수의 값은 20 

함수 호출 시 변수 x의 주소값을 함수에 전달합니다. 호출된 함수에서 포인터 변수로 주소값을 받고 *를 사용하여 변수의 값에 접근합니다. 그러므로 calc 함수에서 *p의 값을 변경하고 어떠한 값을 리턴하지 않아도 main 함수의 x값이 변경됩니다.

처음 프로그램이 실행될 때 왼쪽의 그림과 같이 메모리상에 변수들이 할당될 것입니다. 여기서 calc()함수가 호출되는 시점에 int *p는 x의 주소 값을 저장하므로 결국 main 함수의 x값을 직접 변경할 수 있게 됩니다.

이상으로 함수 호출의 두 가지 방법인 값에 의한 호출(Call by Value)과 참조에 의한 호출(Call by Reference)를 살펴보았습니다.

<< 다음 혼자 공부하는 C언어 이전 >>
반응형