CALL BY VALUE는 함수를 호출할 때 인수로 값을 복사하여 주는 방식이고, CALL BY REFERENCE는 호출 함수의 변수를 호출되는 함수에서 매개변수의 이름으로 직접 사용하는 방식이다.


함수의 인수를 값으로 복사하여 전달하는 경우

  • 함수를 호출할 때, 호출한 함수명 옆 소괄호 안에 있는 데이터를 '인수' 라 칭한다.
  • 호출된 함수에서, 함수명 옆 소괄호 안에 있는 데이터를 '매개변수' 라 칭한다.

예시 1

#include <stdio.h>

void add_ten(int a);

int main(void) {

    int a = 10;

    add_ten(a);

    printf("a: %d",a);

    return 0;
}


void add_ten(int a) {

    a = a + 10;
}

실행결과
a: 10

main()에서 정수형 변수를 선언 및 초기화한다. add_ten()를 호출한다. 이 함수 정의를 보면, 매개변수로 main()의 변수 a의 값 10을 복사한 것을 받아서 다시 10를 더한 뒤 함수를 반환없이 함수를 종료한다. 이후 main()에서 printf()를 통해 값을 확인하면 값의 변화가 없다.

main()에 있는 변수의 값을 직접적으로 바꾼 것이 아니라, 값을 복사한 것을 사용하였기 때문에 a변수 값에 영향을 주지 않는다. 따라서 값이 그대로인 것이다.


함수의 인수로 주소값을 전달하는 경우


  • 주소값을 전달하므로 포인터에 대한 이해가 필요하다.

예시

#include <stdio.h>

void add_ten(int* pa);

int main(void) {



    int a = 10;
    add_ten(&a);

    printf("a: %d", a); 
}


void add_ten(int* pa) {

    *pa = *pa + 10;

}

실행결과
a: 20

정수형 변수 a를 선언 및 10으로 초기화한다. add_ten()의 인수로 변수 a의 주소값을 넘겨준다. add_ten()정의를 보면, 호출한 함수에서 호출된 함수로 주소값을 넘겨주었으므로 이를 넘겨받기 위해서 정수형 포인터 변수를 매개변수로 선언하였다. 포인터 변수pa가 가리키는 곳의 값에 10을 더해서 포인터가 변수가 가리키는 곳에 대입한다. 포인터 변수pa는 값 20을 가지게 되고 함수가 종료된다. main()에서 printf()를 호출하여 값을 확인하면 a값이 20으로 변경된 것을 확인할 수 있다.


주소값을 넘겨주는 방식도 call by value인 이유는 호출할 때 인수로 주소값을 넘겨주어서 직접적으로 메모리공간에 접근할 수 있지만 결국에는 '주소값'을 넘겨준 것이고 이를 간접참조연산을 활용한 포인터로 받은 것이기 때문에 이러한 방식도 call by value에 해당한다.


+ Recent posts