6-3.함수 호출 방식

6-3-가.값 호출

인수란 호출원에서 함수에게 일을 시키기 위한 정보인데 인수를 어떻게 전달하는가에 따라 값 호출(call by value) 방식과 참조 호출(call by reference) 방식이 있다. 인수를 넘기는 방식에 따라 실인수의 값이 변경되는가 아닌가의 차이점이 있다. 다소 어려울 수도 있지만 함수를 이해하는데 아주 중요한 내용이므로 잘 알아 두도록 하자.

먼저 값 호출에 대해 알아보자. 값 호출 방식이란 실인수의 값이 형식 인수로 전달되는 방식이다. 다음 예제의 plusone 함수는 하나의 정수값을 전달받아 그 값에 1을 더한 값을 리턴한다. 1을 더한 값이야 변수에 +1하면 쉽게 구할 수 있지만 호출 방식의 차이점을 보기 위해 의도적으로 함수로 만들어 보았다.

 

: CallValue

#include <Turboc.h>

 

int plusone(int a);

 

void main()

{

     int i,j;

 

     i=5;

     j=plusone(i);

     printf("i=%d, 결과=%d\n",i,j);

}

 

int plusone(int a)

{

     a=a+1;

     return a;

}

 

main에서 정수형 변수 i를 선언하고 이 변수에 5를 대입했다. 그리고 plusone(i)를 호출하면 형식 인수 a가 이 값을 대입받는다. 이 함수에 의해 a값에 1을 더한 값이 리턴되는데 a로 전달된 값이 5였으므로 결과는 6이 될 것이다. main에서는 이 값을 j에 대입한 후 출력했으므로 프로그램 전체의 실행 결과는 "i=5, 결과=6"이 된다.

형식 인수 a가 대입받는 대상이 main의 실인수 i의 값이기 때문에 이런 호출 방식을 값 호출이라고 한다. a는 plusone으로 전달된 실인수의 임시 사본이라고 할 수 있는데 실인수 i와는 전혀 다른 새로운 변수이다. 함수 호출 직후에 i의 값을 대입받았으므로 일시적으로 i와 같은 값을 가지고 있을 뿐이지 i와는 아예 기억되는 메모리 공간 자체가 다르다.

plusone 함수에서 a의 값을 1 증가시켰지만 main에 있는 실인수 i의 값이 바뀌는 것은 아니다. a가 i의 값을 대입받았지만 a를 어떻게 바꾸더라도 i의 값은 전혀 영향을 받지 않는다. a는 어디까지나 사본에 불과하므로 사본이 증가하든 감소하든 원본에 영향을 주지 못한다. plusone은 1증가시킨 a의 값을 리턴했고 main은 이 리턴값을 별도의 변수 j에 대입함으로써 i를 1증가시킨 결과를 취했다.

함수 호출시 전달되는 대상이 실인수 그 자체가 아니라 실인수의 값이기 때문에 이런 호출 방식을 값 호출이라고 부른다. 값 호출의 특징은 형식 인수가 함수내에서 변경되더라도 실인수에는 전혀 영향을 미치지 못한다는 것이다.