CallByValue와 CallByReference


함수를 호출할 때 필요한 경우 인자값을 전달해줄 때가 있다.

인자값을 전달 할 때 2가지 방식이 존재 한다. 

값을 복사하여 전달 하거나 참조값을 넘겨주는 방식인데 이것을 각각

Call-By-Value와 Call-By-Reference 라 한다.



Call-By-Value


각각에 대해 자세히 살펴 보자.

값을 복사 해서 인자 값을 전달 하는 것은 아래와 같다.


#include <stdio.h>


void callByValue( int value )

{

value += 2 ;

}

int main()

{

int i= 5;


callByValue(i);

printf( "callByValue -> i= %d\n", i);
}



main에서 i=5이다.

callByValue를 호출 할 때 i를 인자 값으로 넘겨 주면 함수 인자 value에 i의 값이 복사 된다.

그러므포 callByValue 함수의 인자 값 value는 5가 되며 함수 안에서 아무리 value 값을 바꿔도

main 함수의 i 값에 영향을 미치지 않는다.


위의 프로그램을 수행하면 함수안에서 2를 더했는데도 main의 i 값에는 영향을 받지 않아

printf의 결과는 i 값은 초기값 5 그대로 출력이 된다.




Call-By-Reference


이번에는 함수의 인자를 참조 값으로 전달하는 예를 살펴 보도록 하겠다. 


#include <stdio.h>


void callByReference( int *value )

{

*value += 2;

}


int main()

{

int i= 5;


callByReference(&i);

printf( "callByReference -> i = %d\n", i );

}



callByReference 함수가 정의 된 것을 보면 포인터로 값을 받도록 되어있다.

이말을 callByReference를 호출 할 때 값을 주는 것이 아닌 주소 값을 전달을 받는다.


callByReference( &i ); 부분을 보면 i 앞에 &가 있으며 이 뜻은 i의 주소 값이라는 의미다.

callByReference 함수안의 인자 value는 main 함수의 i와 동일한 주소를 가리키고 있다는 뜻이다.

*value += 2; 를 수행하면 "value가 가리키는 i의 값을 2를 더해줘" 라는 뜻이 되며

함수안에서 value 값이 변경 되면 i의 값이 바뀐다.


위의 프로그램을 수행하면 함수안에서 *value 즉 value가 가리키는 값에 2를 더한 것이 되어 

main의 i 값에는 영향을 받게 되어 printf의 결과는 i 값은 초기값 5에 2를 더한 값인 2가 출력된다.



반응형

'프로그램 > C' 카테고리의 다른 글

[C] 구조체  (0) 2017.07.24
[C] 포인터와 상수(const)  (0) 2017.07.23
[C] 포인터와 배열  (0) 2017.07.19
[C] 시간차이 구하기 ( millisecond 까지.. )  (0) 2017.07.16
[C] 포인터 자료형  (0) 2017.07.13

+ Recent posts