call by value & reference

코딩하는 기린·2022년 3월 6일
0

C

목록 보기
10/13

다른 블럭에 함수를 정의하고 사용하여 값을 주고 받을 때, C에서는 기본적으로 지역 변수로 선언된 변수의 값은 서로 다른 블럭에서 사용할 수 없기때문에 기대한 결과값과 실제 결과값이 다르게 나올 수 있습니다. 이런 상황을 위해 매개변수 간 자료 전달 방법에 대해 알 필요가 있습니다.

call by value

'call by value(값에 의한 호출)'는 함수를 호출하여 인자를 매개변수로 넘겨줄 때 값을 복사하여 넘겨줍니다.

#include <stdio.h>

void swap(int x, int y);
int main(){
    int x = 1, y = 2;

    printf("원래 값\n");
    printf("x = %d, y = %d\n", x, y);

    swap(x, y);

    printf("\n");
    printf("바꾼 값\n");
    printf("x = %d, y = %d\n", x, y);
}

//매개변수로 받은 두 값을 서로 교환
void swap(int x, int y){
    int tmp;

    tmp = x;
    x = y;
    y = tmp;
}
원래 값     
x = 1, y = 2

바꾼 값     
x = 1, y = 2

swap() 함수는 매개변수로 받은 두 인자 값을 서로 교환할 목적으로 작성했지만 실행 결과는 교환이 되지 않은 것을 확인할 수 있습니다.
C에서 기본으로 사용되는 이 방식은 복사하여 인자를 넘겨주면 서로 별개의 변수가 되므로, 넘겨주는 순간 더이상 관련이 없어지기때문입니다.
물론 swap() 함수의 반환 자료형을 void가 아닌 int로 바꿔 return문을 이용하면 값의 반환이 가능하지만, 하나의 값 밖에 반환할 수 없기때문에 사실상 불가능합니다.

call by reference

'call by reference(참조에 의한 호출)'는 함수를 호출하여 인자의 주소값을 매개변수로 넘겨줍니다.

정확히 얘기하자면 C에서는 공식적으로 call by reference를 지원하지않는다고합니다. 따라서 이 예시의 방법은 주소값을 복사하여 넘겨주므로 call by reference가 아닌 'call by address'로 보는 것이 맞다고 합니다.

#include <stdio.h>

void swap(int *x, int *y);
int main(){
    int x = 1, y = 2;

    printf("원래 값\n");
    printf("x = %d, y = %d\n", x, y);

    swap(&x, &y);

    printf("\n");
    printf("바꾼 값\n");
    printf("x = %d, y = %d\n", x, y);
}

//매개변수로 받은 두 값을 서로 교환
void swap(int *x, int *y){
    int tmp;

    tmp = *x;
    *x = *y;
    *y = tmp;
}
원래 값
x = 1, y = 2

바꾼 값
x = 2, y = 1

자료 값이 아닌 인자의 주소값을 (복사하여) 넘겨주었습니다. 따라서 swap() 함수에서도 기억공간의 주소에 접근함으로써 해당 주소에있는 자료값을 얻을 수 있으므로, 포인터를 사용하여 두 기억공간에 있는 자료값을 서로 교환해주었습니다.

profile
Coding Giraffe.

0개의 댓글