본문 바로가기

프로그래밍

3. C와 Call by Reference

보통 C라는 언어를 배울때, 이 얘기는 꼭 들어간다

함수를 호출할때 매개변수로 포인터를 넘길때, 이걸 Call by Reference라고 설명한다.

하지만 이 말엔 논란의 여지가 많다.

왜 많냐고 하면, C++의 참조자(영어로 Reference)나 타 언어의 레퍼런스랑 비교했을때 그 성격이 포인터는 많이 다르기 때문이다.

 

그냥 쉽게 생각해보자. 일단 레퍼런스가 뭘까? 

int a =5;

int & b=a;

b++;

이렇게 하면 a는 6이 된다.

int a = 5;

a++;

랑 의미적으로 동일하다.

다만 그걸 b라는 레퍼런스를 이용해서, 다른 이름을 지어주고 만지작 대는 셈이다.

 

왜 이런게 있느냐면, 보통 Call by Reference에 사용하기 때문이다.

이 레퍼런스를 함수의 인자로 넘겨주는게 Call by Reference다.

작명이 알고보면 참으로 단순하다.

 

반면 C의 포인터는 그 색깔이 좀 많이 다르다.

int a=5;

int * p=a;

p++;

이런식으로 한다고 되지 않는다.

포인터는 거기에 들어있는걸 값으로 해석한다. 단지 그 값이 주소값이라는 거다.

즉, 원본과 동일하게 취급해주면 안되고, &a, *p 같은 연산을 사용해서 계산해주면 된다.

그렇기 때문에 앞서 말한 Reference라고 말하기엔 뭔가 모자라다. 

 

그렇다고 Call by Value라고 말하기에도 이상하다. 일단 포인터는 그 값 자체가 주소값이라서 값은 맞지만, 실제로 존재하는 다른 값을 참조하는게 존재 이유다. 약간 데이터를 지정하는 메타데이터 같은 느낌이라고 해야하나.

아무튼 포인터 그 자체보다는  포인터가 가리키는 값이 더 중요하고 그게 포인터의 존재 이유기 때문에 단순히 Value 말하기에도 찜찜하다. 즉 Call by Reference라고 부를 이유도 있긴 하다는 것.

 

이런 점 때문에 피터지게(?) 논란이 되는 것이다. "포인터는 Call by Reference인가 아닌가???"

양쪽 의견이 따지고보면 나름대로 서로 합리적인 주장이다. 

원래는 원전인 tcpl에도 Call by Reference라는 내용이 있었다고 하지만, 현재는 삭제되었다. 

즉 C의 주인장도 그 말이 완전히 맞다고는 보지 않고 빼버린거다.

 

나는 어느 쪽인거 같냐고 묻는다면 걍 Call by Pointer가 아닐까 싶다.

뭐 사실 이런 논란은 의미가 없다. 어느쪽이든 프로그래밍 해서 나오는 코드는 똑같으니까.

아님말고