새소식

프로그래밍/C

Call by Value, Call by Reference 비교

  • -

함수의 호출 방법에는 Call by Value (값에 의한 호출)와 Call by Reference (참조에 의한 호출) 2가지 방식이 있다.

 

1. Call by Value

값에 의한 호출로 함수의 매개 변수에 내용물을 전달하여 복사해 사용하는 방식이다. 

백문이 불여일견이기에 실습을 통해 위 내용을 확인해보겠다. 

 

#include <stdio.h>

void swap(int x, int y)
{
	int tmp;
	tmp = x;
	x = y;
	y = tmp;
}

int main(void)
{
	int a = 100, b = 200;
	printf("swap을 호출하기 전 : a = %d, b = %d\n", a, b);
	swap(a,b);
	printf("swap을 호출한 후 : a = %d, b = %d\n", a, b);
	return 0;
}

 

 

실행결과 호출하기 전과 후 a, b의 값은 변하지 않고 그대로 출력되었다.

그 이유는 main 함수 안에 있는 a, b 변수를 매개변수로 직접 보낸 것이 아닌 함수에서 복사하여 사용했기 때문에 실제 main 함수 안에 a, b의 값은 변하지 않은 것이다.

 


2. Call by Reference

주소에 의한 호출로 주소를 참조해서 호출하는 방식이다.

이것 또한 위의 코드를 수정해서 실습해보겠다.

 

#include <stdio.h>

void swap(int *px, int *py)
{
	int tmp;
	tmp = *px;
	*px = *py;
	*py = tmp;
}

int main(void)
{
	int a = 100, b = 200;
	printf("swap을 호출하기 전 : a = %d, b = %d\n", a, b);
	swap(&a,&b);
	printf("swap을 호출한 후 : a = %d, b = %d\n", a, b);
	return 0;
}

 

 

실행결과 호출하기 전과 후 a, b의 값은 성공적으로 변했다. 

그 이유는 swap 함수에 a, b의 주소를 전달하고 수정을 했기 때문에 main 함수 안에 있는 a, b의 값이 변한 것이다. 즉, 특정한 변수를 가리키는 포인터가 함수의 매개변수로 전달되면 그 포인터를 이용하여 함수 안에서 외부 변수의 값을 변경할 수 있다.

 


3. 장단점

 

1) Call by Value (값에 의한 호출)

  • 장점 : 복사하여 처리하기 때문에 안전하며, 원래의 값이 보존된다.
  • 단점 : 복사를 하기 때문에 메모리 사용량이 늘어난다.

 

2) Call by Reference (참조에 의한 호출)

  • 장점 : 복사하지 않고 직접 참조를 하기 때문에 빠르다.
  • 단점 : 직접 참조를 하기에 원래 값이 영향을 받는다. (리스크)

4. 참고문헌

 

https://codingplus.tistory.com/29

 

 

 

 

 

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

구조체  (0) 2020.06.10
포인터를 쓰는 이유  (0) 2020.03.27
포인터란?  (0) 2020.03.27
아스키코드란?  (0) 2020.03.26
자료형이란?  (0) 2020.03.26
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.