보통 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가 아닐까 싶다.
뭐 사실 이런 논란은 의미가 없다. 어느쪽이든 프로그래밍 해서 나오는 코드는 똑같으니까.
아님말고
'프로그래밍' 카테고리의 다른 글
[node.js] net 이벤트 정리 (0) | 2020.07.06 |
---|---|
4. Exception을 지양하는 이유가 뭘까? (1) | 2020.05.20 |
FMOD 테스트코드 (0) | 2020.03.24 |
[Unity] PlayerPrefs를 빌드 파일에서 지워보자 (0) | 2020.02.26 |
2. 사람들은 왜 동적 타이핑을 싫어할까? (0) | 2019.06.19 |