C언어 프로그램 함수 호출 방식
C언어 프로그램 함수 호출 방식
C언어에서 어떤 기능을 실행하기 위해서 함수를 호출할 때 단순하게 이름으로 호출해서 그 안에 포함된 내용만 실행하도록 하는 경우도 있지만 어떤 값들을 전달하면서 호출하고 전달된 값을 이용해서 프로그램을 실행하게 하는 경우도 있는데요. 이렇게 값을 전달하면서 호출하는 방식은 두 가지가 있습니다. 첫 번째는 데이터를 전달하는 방식이구요.(Call-by-vlaue) 두 번째는 지난 글에서 알아봤던 데이터의 주소 값(Call-by-reference)을 전달하는 방식입니다.
예제를 만들면서 어떤 때 사용되는지 확인해보겠습니다. 먼저 단순하게 값을 전달하는 방식입니다.
▲ main() 에서 두 개의 변수를 선언한 후 각각 100과 200으로 초기화 한 후 aaa() 를 호출하면서 그 값들을 전달하고 있습니다. aaa()에서는 전달받은 값을 서로 바꾸고 있는 모습인데요. x에는 100이 y에는 200이 전달됐지만 출력되는 값은 두 값이 바뀌어서 출력됩니다.
하지만 aaa() 는 단순하게 두 수를 바꿔서 출력하는 역할만 할 뿐 su1과 su2에 저장된 값 자체를 서로 바꾸지는 못하는데요. 확인해보겠습니다.
▲ aaa()를 실행한 후 다시 su1과 su2를 출력해봤는데 값이 처음 그대로 인걸 확인할 수 있습니다. 이는 지난 글에서도 정리했지만 함수에 전달되는 값들이 복사돼서 전달되기 때문인데요. 그렇다면 aaa()가 su1과 su2의 값을 완전히 바꾸는 역할을 하는 함수라면 어떻게 해야 할까요? 그럴 때는 단순하게 전달되는 값에 접근할 것이 아니라 저 데이터들이 저장된 주소에 접근해서 값을 바꿔버리면 됩니다. 즉, 데이터들의 주소를 받아서 그곳에 저장된 값을 바꿔버리면 됩니다. 당연히 포인터 변수를 이용해야겠죠? 예제에 적용해보겠습니다.
▲ 함수를 호출하면서 '&'연산자를 이용해서 해당 데이터들의 주소값을 전달하고 있습니다. 호출된 함수에서는 포인터 변수로 그 주소값을 받아서 '*'연산자를 이용해서 각각의 값에 접근해서 값을 바꾸고 있는 모습입니다. 프로그램 실행 결과를 보면 함수를 실행한 후에 su1과 su2의 값이 바뀐 걸 확인할 수 있습니다.
이렇게 해서 함수를 호출하면서 주소 값을 전달해서 그곳에 저장된 값을 변경하는 예제를 통해서 Call by reference 형식에 대해서 알아봤습니다.