함수의 선언과 정의
함수에는 ‘선언’과 ‘정의’가 있다. 여기서 함수의 선언은 문법에 속하고, 함수의 정의는 실제와 관련되어 있다. 다시 말해서 선언은 함수의 설계고, 정의는 함수의 구연이다. 이 선언과 정의를 합쳐서 함수를 만들었다 할 수 있는 것이다. 근데 함수만 만들어서 무엇을 할까? 구슬이 서 말이라도 꿰어야 보배라고 하듯이, 함수를 이렇게 사용하는 것을, ‘호출‘이라고 하고 영어로 Call이라고 한다.
함수와 흐름
세로로 선을 긋고, 위에는 main()로 아래는 프로그램(p/g)의 마지막으로 쓴다면, 그 선이 아래로 가면서 printf같은 함수를 만나서 곡선으로 모양이 틀어졌다가 다시 원래의 선으로 돌아 올 것이다. 이때 반복되는 흐름을 어떤 것으로 대체해주면 어떨까? 사용자지정 함수가 바로 그것이다.
사용자지정 함수의 선언과 정의
사용자지정 함수는 코드를 만드는 사람이 직접 만들 수 있는 함수다. 이 함수의 형식은 지난시간 배운 것과 똑같은데, 특징은 main함수 안이 아닌 위쪽에 선언되는 것이다. void FuncA(void)와 같이 선언하는데, 이 함수가 하는 일은 스코프{ }를 쳐서 그 안에 써줄 수 있다. 그리고 함수의 호출은, main함수 안에서 필요할 때에 FuncA();로 불러주면 되는데, 이때 main함수에 흐르던 흐름이 갑자기 붕 떠서 함수의 정의부분으로 간다. 그래서 함수의 작업이 끝나면 return이 먹어서 다시 함수를 부른 그 순간으로 돌아가는 것이다. 함수를 부르면 그 함수를 부른 시점의 그다음에 항상 호출 후에 돌아오는 것이 매우 중요하다.
함수를 만드는 이유는 코드를 보면 알 것이다. 똑같은 부분, 프로그램에 동일한 조각이 반복되는 것을 함수로 만들어서 간단하고, 사용하기 쉽게 정리하는 것이다. 그래서 비유하자면, 나사를 오른쪽으로 반 바퀴 쪼이고 다시 8번 쪼이는 과정을 함수로 ‘몽키’라고 하면 그 과정이 들어있는 함수만 호출해도 언제든지 그 과정을 구현할 수 있는 것이다.
call, caller, callee
코드에서 위의 예로는 main이 FuncA(int)함수를 호출했었다. 이것에 대해서 서로 관계에 대해 용어가 있는데, 우선 함수 호출은 Call, 그리고 함수를 호출하는 함수(호출자 함수라고 한다)인 main은 Caller, 호출하는 대상인 함수인 FuncA(int)는 Callee가 된다. 이 Callee는 다시 호출자함수로 돌아가는 것이고, 이것을 return이라고 한다.