용어의 정리
우선 매개변수의 전달방식을 들어가기 전에 용어 정리를 하자. main함수, gets함수, putchar함수가 있다면, main이 두 함수를 호출한 관계가 돼서, 호출을 Call, 호출하는 함수인 main을 Caller, 호출되는 함수인 gets, putchar를 Callee라고 한다. 이때 함수를 호출할 때 필수로 들어가는 매개변수가 있는데, 이 안에 인수, 인자가 들어가게 된다. 이때 중요한 점은 매개변수의 값을 결정하는 것이다.(초기화라고 한다)
지난시간 이미 배웠다. Caller가 매개변수의 초기화를 해주는 것을 말이다.
gets를 보면 (매개변수)로 입력된 값이 저장될 주소 값을, putchar는 (매개변수)에 출력할 값(65를 넣으면 A가 아스키코드의 값)이 된다.
매개변수의 전달방식
이때 두 경우를 따로 칭하는 용어가 있는데, Caller가 매개변수로 주소 타입을 넣어주는 것을 Call by Reference(레퍼런스), 매개변수가 값으로 넣으면 Call by Value(밸류)라고 한다. 여기서 ‘콜 바이 레퍼런스‘ 는 서비스라고 비유 할 수 있는데, 직접 입력을 해야 되는 ‘콜 바이 벨류‘ 와 다르게, 주소만 입력해주면 알아서 주소의 값을 찾아서 처리해주기 때문이다.
신발끈 공식
컵 2개에 우유와 주스가 담겨있는데, 이 내용물을 서로 바꾸고 싶으면 어떻게 하면 될까? 간단하게 빈 컵을 가져와서 tmp(임시)라는 컵으로 서로 바꿔주면 된다. 이걸 식으로 표현하면, tmp = A; A = B; B = tmp; 와 같이 표현할 수 있다. 이것을 사선공식, 신발끈 공식이라고 하니 알아두자. 이걸 XOR로 표현해서 교체 알고리즘을 쓸 수 있지만, 이 방법은 쓰면 문제가 있으니 재미로만 알아두자.
예시
void Swap(int nA, int nB) { 로 스코프에 신발끈 공식을 쓰고, main함수에서 x= 5, y= 9;해서 swap(x, y);라고 하면, x, y가 int nA, int nB가 된다고 생각하면 안 된다. 그것은 비유하자면, 커피가 담긴 x컵을 int nA로 전달할 때, 커피는 버리고 컵만 전달하는 것과 같다. 항상 변수보다 변수에 담긴 값을 보는 것이 중요하다. 이때 매개변수의 전달방식은 Call by value(콜 바이 밸류)란 것을 알 수 있다.
이것을 바꾸면 void Swap(int* nA, int* nB)하고 swap(&x, &y)로 할 수도 있다. x에 주소연산자&를 붙여서 주소 값을 인자로 넘기는데, 이때 매개변수가 포인터이므로, 주소 값을 받고, 전달받은 값이 매개변수가 된다. 이것이 Call by reference(콜 바이 레퍼런스)이다. 이때 매개변수로 주소 타입을 넣어주는 것이 이것이다.
'c언어 > 워딩(미정리)' 카테고리의 다른 글
문자열 처리함수 (0) | 2019.07.08 |
---|---|
문자열의 구분 및 문자 처리 함수 (0) | 2019.07.08 |
함수 설계 원칙 (0) | 2019.07.08 |
함수의 문법, 호출 (0) | 2019.07.08 |
함수 (0) | 2019.07.08 |