값에 의한 전달 vs 참조에 의한 전달 / from 윤성우 or 포프
함수를 호출할 때 단순히 값을 전달하는 형태의 함수호출을 가리켜 Call-by-value라 하고,
메모리의 접근에 사용되는 주소 값을 전달하는 형태의 함수호출을 가리켜 Call-by-reference라 합니다.
그럼 매개변수로 배열을 전달하는 경우는 어느 쪽이라고 말할 수 있을까요?
1. 원본이 바뀌니까 참조에 의한 전달이다.
2. 아니다 메모리 주소를 복사했으니깐 결국은 값에 의한 전달이다.
엄밀히 말하면 C언어는 함수를 호출할 때 언제나 변수(그게 포인터든, 아니든)를 복사합니다.
즉, 매개변수로 들어온건 타입에 상관없이 복사를 할 뿐이니 값에 의한 전달이라고 말할 수 있습니다.
포인터를 사용한다는 것은 참조에 의한 전달을 흉내내기 위함입니다.
C언어는 참조에 의한 전달이 없습니다. 값에 의한 전달만 있을 뿐입니다.
하지만 프로그래머들 사이에서 원본을 바꾸고 싶다면 '참조에 의한 전달로 바꾸자.' 라고 말하기 때문에
언어적으로 파고들어가면 아닐 수 있지만 원본을 바꾼다에 초점을 맞춰 알아들으면 됩니다.
그래서 ㅇ에 대한 전달보다 좋은 표현은 '원본을 바꾸자'입니다.
라는게 프로그래머 포프님의 주장입니다. ㅎㅎ
만약 '윤성우 열혈 C 프로그래밍' 책을 통해 C언어를 공부하신 분이 이 글을 읽는다면 읭? 하실 것 같은데요.
저 역시 지금 C언어를 공부하면서 블로그 글을 작성하는 입장이고, '윤성우 열혈 C 프로그래밍' 책 315페이지와 포프 'C 언매니지드 프로그래밍'의 102번 강의 수강하면서 '값에 의한 전달 vs 참조에 의한 전달'에 대해 두 분의 설명이 좀 다른 감이 있어 헷갈렸습니다.
결론은
함수를 호출할 때 매개변수로 들어온 건 복사를 할 뿐이다. 그래서 '값에 의한 전달'이다.
그런데 복사된 값이 주소 값이면 결국은 주소 값을 전달한 것이니 다른 말로 '참조의 의한 전달'로 부를 수도 있다.
라는 포프님의 설명이 더 일리가 있는 것 같아 포프님의 강의를 토대로 작성하였습니다.
(다 말하기 나름 아니겠습니까..)
-----------------------------------
-----------------------------------
'컴퓨터 공학 > C, C++' 카테고리의 다른 글
[ C ] 포인터 이해하기6_void 포인터 개념 / 활용도 (411) | 2020.07.19 |
---|---|
[ C ] 포인터 이해하기5_값과 주소를 보호하는 const/const 읽는 방법 (387) | 2020.07.19 |
[ C ] 포인터 이해하기3_포인터와 배열의 차이 (400) | 2020.07.18 |
[ C ] 포인터 이해하기2_참조와 역참조/ 역 참조 연산자 * (611) | 2020.07.18 |
[ C ] 포인터 이해하기1_포인터 변수란?/선언 방법 / & 연산자 (393) | 2020.07.17 |
댓글