50 – 함수간 데이터 전달 기법

함수가 제대로 동작하려면 한 함수에서 다른 함수를 호출할 때 필요한 값을 전달해주기도 하고 결과값을 전달받기도 해야 하는데, 함수들끼리 주고받는 데이터를 매개변수(parameter)라고 한다. 그리고 특별히 함수를 호출하는 쪽의 매개변수를 실매개변수(actual parameter)라고 하고, 함수를 정의한 쪽의 매개변수를 형식매개변수(formal parameter)라고 한다.

C언어에서 함수를 호출할 때 매개변수를 전달하는 방법에는 다음 두 가지가 있다. 하나하나 살펴본다.

우선 ‘값에 의한 전달(call by value)’는 함수 호출 시 값만 함수쪽으로 보내 해당 값을 매개변수에 저장해 동작하는 방법으로, 함수 실행중에 형식매개변수의 내용이 변해도 실매개변수의 니용은 전혀 변하지 않는다. 즉, 값이 그대로 함수쪽의 매개변수에 복사되어 별도의 변수처럼 취급되는 것이다.

그리고 ‘주소에 의한 전달(call by address)’ (call by reference라고도 합니다.)은 값을 전달하는 것이 아닌 전달하고자 하는 변수의 메모리 주소를 전달하는 방법으로, 함수 실행중에 형식 매개변수 값의 조정에 따라 실매개변수의 내용이 변경되는 방법이다. 당연히 포인터에 대한 개념이 제대로 있어야 쓸 수 있다.

이 두 가지를 직접 하나의 예제에 박아서 작성하였다. 함수명에도 적혀있지만 call by value, call by address(call by reference) 형식으로 전달하는 방법을 보여주는데, 결과값이 확실히 다른 것을 볼 수 있다.

스크린샷 2017-04-05 오전 1.35.17

call by value로 호출한 함수의 경우에는 두 변수의 값을 바꾸는 작업을 하였는데도 불구하고 함수에서 쓰인 변수와 main에 선언한 변수는 별개의 값으로 취급되기 때문에 둘의 값을 바꾼 건 함수 안에서만의 동작이고 실제로는 바뀌지 않았다. 그러나 call by address의 경우에는 main에서 선언한 변수를 포인터로 가져와서 치완하는 작업을 진행하였기 때문에 해당하는 값을 그대로 바꿨다. 그래서 출력 결과가 바뀌어 있는 것이다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.