반응형

최근 C언어에 대해 공부하다 오개념으로 알고 있던 것을 명확하게 알려준 블로그를 보고 글을 작성하게 되었다.

 

------

 

 

 

우리가 C언어 책을 보며 함수 파트를 배우다보면 call by value 와 call by reference 라는 개념이 나오게 된다.

 

 

정말 간단하게 설명하자면 call by value는 값을 인자로 전달받아 함수 내에서 그 값을 수정하더라도 원래의 변수는 아무런 변화가 없는 것이고

 

call by reference 는 주소(포인터)를 인자로 받아 함수 내에서 변수를 수정하게 되면 해당되는 주소에 있는 변수 값이 변화되는 것이다.

 

간단히 말해서 일반 변수를 인자로 받으면 call by value, 포인터 변수를 이용해 인자의 주소 값을 받으면 call by reference 라고 알고 있었고 그래서 'C언어에는 call by value와 call by reference 가 존재한다' 라고 알고 있었다.

 

하지만 정확히 말하자면 틀렸다.

 

C언어에는 call by reference 라는 것은 없고 오로지 call by value만 존재한다. 그 근거를 간단하게 말해보자면

 

1. C언어 창시자 데니스 리치가 출간한 책 'The C PROGRAMMING LANGUAGE' 에서는 C언어의 모든 함수의 인자는 Value로써 넘겨진다고 말한다. 또한 이것으로 인해 다른 'call by reference' 언어와는 몇가지 다른 속성이 생긴다고도 말하고 있다.

 

 

2. 위키피디아의 'call by reference' 에 대한 개념과 'The Programming Language' 에서 묘사한 개념은 똑같다. "함수 내에서 인자로 주어진 변수의 값을 변경" 할 수 있어야 'call by reference' 라는 것이다.

 

 

 

우리가 흔히 C언어에서 call by reference 라고 표현하는 함수를 보자,

void swap(int *a, int *b) {
	*a = 0;
	a = NULL;
	*b = 0;
	b = NULL;
}
int main() {
	
	int num_1 = 1;
	int num_2 = 2;
	int *arg_1 = &num_1;
	int *arg_2 = &num_2;

	swap(arg_1, arg_2);
}

 

 

여기서 인자는 arg_1, arg_2 이다 하지만 당연하게도 swap 함수 내에서 두 인자의 값은 변하지 않는다.

 

C언어가 'call by reference'  언어가 아니기 때문에 당연한 것이다.

 

 

3. C언어 표준인 C11에도 C언어는 'call by reference' 가 아닌 'call by value' 라고 말하고 있다.

 

 

4. 위키피디아에는 'call by reference'를 흉내낼 수 있으며 그 기법을 사용하는 대표적인 언어가 C라고 말하고 있다. 즉 포인터를 이용해 흉내내더라도 그 근본은 'call by value'라는 것이다.

 

 

 

 

사실 C언어가 포인터를 이용해 call by reference 를 흉내낼 수 있는 것은 사실이기에 굳이 여기까지 알아야하나 싶지만 그래도 오개념을 당당하게 알고 있는거보단 좀 더 자세하게 알고 있는게 좋을거 같아서 포스팅을 하게 되었다.

 

 

 

 

좀 더 근본적인 내용을 알고 싶으시다면 참고한 블로그에 가보시는걸 추천합니다. C언어에 call by reference가 없다를 설명한 글이 3개나 있는데 이글은 그 중 한개의 글을 복붙한 수준입니다. 

 

 

 

 

reference : https://blog.naver.com/han95173/220934411280

반응형

'IT > C 언어' 카테고리의 다른 글

왜 main 함수의 끝은 return 0 일까?  (0) 2022.04.29
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기