Always Be Wise

Call by value & Call by reference 본문

프로그래밍 언어/C

Call by value & Call by reference

bewisesh91 2021. 12. 4. 11:07
728x90

인자를 전달하는 방식은 크게 Call by value와 Call by reference로 구분된다.

 

Call by value

기본적으로 C 언어에서 지원하는 방식은 Call by value이다.

함수에서 값을 복사해서 전달하는 방식으로, 인자로 전달되는 변수를 함수의 매개변수에 복사한다.

이렇게 복사되면 인자로 전달한 변수와는 별개의 변수가 되며, 매개변수를 변경해도 원래의 변수에는 영향을 미치지 않는다.

따라서 원본 값을 바꿀 필요가 없는 경우에는 Call by value 방식을 이용하면 된다. 

아래 코드를 실행해보면 swap을 진행해도 매개변수가 바뀌는 것일뿐 원래 변수인 a, b의 값이 변하지는 않는다.

#include <stdio.h>

void swap(int a, int b)
{
	int temp;
	
	temp = a;
	a = b;
	b = temp;
}

int main()
{
	int a, b;
	
	a = 10;
	b = 20;
	
	printf("swap 전 : %d %d\n", a, b);
	
	swap(a, b);
	
	printf("swap 후 : %d %d\n", a, b);
	
	return 0;
}

Call by reference

함수에서 값을 전달하는 대신 주소값을 전달하는 방식을 Call by reference라고 한다. C언어에서 포인터를 사용해서 주소값을

넘겨주는 것은 엄밀히 말해 주소값 자체를 복사해서 넘겨주는 것이므로 Call by value이다. 이렇게 주소값을 복사해서 넘겨주는

것을 Call by address 방식이라고 한다. 즉, C 언어에서는 Call by reference를 공식적으로 지원하지는 않으나, 의미적, 결과적으로

Call by address를 이용해서 Call by reference와 같이 사용할 수 있다. 아래 코드를 실행해보면 그냥 변수를 넘겨줄 때와 달리

원래 변수의 값도 바뀐다. 이렇게 포인터를 이용해서 Call by reference를 구현한 것이다.

#include <stdio.h>

void swap(int *a, int *b)
{
	int temp;

	temp = *a;
	*a = *b;
	*b = temp;
}

int main()
{
	int a, b;

	a = 10;
	b = 20;

	printf("swap 전 : %d %d\n", a, b);

	swap(&a, &b);

	printf("swap 후 : %d %d\n", a, b);

	return 0;
}

'프로그래밍 언어 > C' 카테고리의 다른 글

상수 포인터  (0) 2021.12.04
포인터 연산과 배열  (0) 2021.12.04
포인터란?  (0) 2021.12.04
함수란?  (0) 2021.12.04
조건문  (0) 2021.12.03
Comments