C 언어 - 용어 Call by value & Call by reference

컴퓨터/C

728x90
반응형

용어의 중요성 

어떠한 업종이던 표준과 용어는 아주 중요합니다. 역사적인 천재가 아닌 이상 대부분이 이미 만들어진 개념들을 응용 또는 사용하기 때문입니다. 혼자만의 일이 아닌 공통된 사람들과 지식을 공유하고 정보를 나누려면 표준과 용어들을 알아둘 필요가 있습니다.

 

Call by value & Call by reference

C언어뿐 아니라 다양한 프로그래밍 언어에서 함수를 호출하는 방식을 크게 두 가지로 분류를 합니다. 

 

  • Call by value ( 값을 복사하는 함수 호출)
  • Call by reference (값을 참조하는 함수 호출)

용어가 다소 생수 할 수 있는데 이 함수를 호출할 때 쓰이는 이 용어는 이미 우리가 알고 있고 사용하고 있는 개념입니다.

 

Call by value (값을 복사하여 함수를 호출하는 형식)

C언어에서 함수를 호출에 매개변수를 넣어 호출을 하면 호출된 함수의 스택 영역에 매개변수로 한 새로운 지역변수가 생깁니다. 

즉 함수를 호출할 때 사용된 변수의 값은 변화되지 않은 새로운 변수가 호출된 함수 영역에서 생기는 것입니다. 

다음과 같은 경우를 예를 들어 볼 수 있습니다.

#include<stdio.h>
void func(int count)
{
	count = 1000;
    printf("함수 안에서의 지역변수 count의 값 : %d\n",count);
}

int main()
{
	int count = 10;
    func(count);
    printf("함수가 실행된 후 main의 지역변수 count의 값 : %d\n",count);
	return 0;
}

 위의 소스코드처럼 일반적인 변수의 형태를 매개변수로 하여 호출을 하면 매개변수들은 값을 복사하는 형태로 함수 단위의 프로그램을 수행하게 됩니다. 이를 Call by value라고 부르며 특징은 아래와 같습니다.

  • 복사하여 처리를 하기 때문에 전달된 인자에 대한 값을 안전하게 사용할 수 있습니다.
  • 해당 자료형의 값을 복사를 하기 때문에 전달되는 인자의 크기가 커 메모리의 사용량이 늘어납니다.

Call by reference(참조 호출 - 메모리의 주소를 복사하여 호출하는 형식)

이 방식의 함수 호출의 대표적인 예는 바로 포인터를 사용했을 때입니다. 포인터는 메모리의 주소를 저장하여 그 저장된 주소 안의 데이터를 제어합니다. 이를 이용하는 방식을 Call by reference라고 합니다.

#include<stdio.h>

void func(int* count)
{
	*count = 1000;
	printf("함수 종료 전 count 값 : %d\n",*count);
}

int main()
{
	int count = 10;
	func(&count);
	printf("함수가 실행된 후 main의 지역변수 count의 값 : %d\n", count);
	return 0;
}

위의 소스코드처럼 포인터 변수를 이용해서 지역변수의 주소를 매개변수로 인자로 호출을 한다면 함수에는 포인터 매개변수로 main의 count 변수의 주소를 받아오게 됩니다. 이런 식의 제어를 우리는 Call byreference라고 하며 특징은 다음과 같습니다.

  • 메모리의 주소만을 넘겨주면 되기 때문에 메모리 사용량이 더 효율적이다.
  • 해당 메모리 주소의 데이터 값을 제어를 하기 때문에 사용에 유의가 필요하다(원본 Data의 변화가 가능하다).

 

이미 이 기능들과 개념들은 다 익혔을 것이라 생각하지만, 사회에서 정보와 지식을 공유하기 위해서는 알아두시면 좋을 것 같습니다.

728x90
반응형

Commnet

G91개발일지

Gon91(지구일)

91년생 공학엔지니어의 개발일지

TODAY :

YESTER DAY :

TOTAL :