6-1-바.함수의 다른 이름

C에서 함수라고 부르는 것은 영문의 function이라는 용어를 지나치게 그대로 직역한 것이다. function을 영한사전에서 찾아 보면 기능, 작용, 직무, 함수, 행사 등등의 다양한 뜻이 있는데 이 단어를 함수라고 번역하게 된 이유는 최초 컴퓨터라는 물건을 수학자들이 주로 사용했기 때문이다. 수학적 의미의 함수는 여러 가지 입력값으로부터 계산을 통해 단 하나의 출력값을 만들어내는 수식이다.

그러나 C의 함수는 값의 계산이나 수학적으로 대응되는 값을 찾아내는 동작보다 훨씬 더 많은 일을 하고 있기 때문에 function을 함수로 번역하는 것은 사실 정확하지 않다. 차라리 "기능"이라고 번역하는 것이 더 적당하다고 할 수 있다. 일반적으로 function을 함수로 번역하고 있고 이미 함수라는 용어가 일반화 되었기 때문에 이 책도 우세한 번역을 따르고 있다.

프로그램이란 반복적인 작업을 처리하는 경우가 많고 main에서 모든 것을 다 처리할 수 없기 때문에 기능별로 코드를 분할해야 한다. 그래서 C뿐만 아니라 다른 언어에서도 프로그램의 부품에 해당하는 함수의 개념이 있다. 예를 들어 파스칼이나 비주얼 베이직같은 언어는 C의 함수에 해당하는 두 가지 개념이 존재한다.

 

함수(function) : 특정 계산을 수행하며 리턴값이 있다. 반드시 수식내에서만 사용할 수 있으며 함수 단독으로 문장을 구성할 수 없다. 이 경우는 수학적 의미의 함수와 거의 유사하므로 적합한 용어 사용예라 할 수 있다.

프로시저(procedure) : 특정 작업을 수행하며 리턴값이 없다. 리턴값이 없기 때문에 수식내에서는 사용할 수 없으며 단독으로 문장을 구성할 수는 있다. C의 void 함수가 이에 해당한다.

 

C의 함수는 파스칼의 함수와 프로시저에 해당하는 특성을 모두 가진다. 리턴값이 있을 수도 있고 없을 수도 있으며 모든 함수는 단독으로 사용할 수 있다. 파스칼은 형태에 따라 함수와 프로시저를 엄격하게 구분하여 실수를 방지하지만 C언어는 특별한 구분이 없으므로 융통성이 있다. 다음은 다른 언어와 구분되는 C 함수의 특징들이다.

 

함수끼리는 서로 평등한 관계에 있으며 상호 수평적이다. 즉, 함수끼리 언제나 호출 가능하다는 뜻이며 한 함수가 다른 함수에 예속되지 않는다. 반면 파스칼은 함수 내부에 지역 함수를 정의할 수 있어 함수끼리 수직적인 계층을 이룰 수 있다.

함수 중에서 가장 기본이 되는 함수를 main이라고 하며 프로그램의 시작점이 된다. 그러나 main이 다른 함수들과 특별히 다르지는 않으며 다만 프로그램의 실행 시작점이라는 것만 조금 특수할 뿐이다.

리턴값은 있을 수도 있고 없을 수도 있다. 리턴값이 있는 함수는 리턴 타입을 가지며 그렇지 않은 함수는 void형으로 선언하면 된다.

항상 단독으로 문장을 구성할 수 있다. 리턴값이 없는 함수는 단독으로만 사용할 수 있고 리턴값이 있는 함수는 수식 내에서 쓸 수도 있고 단독으로 쓸 수도 있다. 값을 리턴하는 함수라고 해서 반드시 리턴 값을 대입받거나 수식내에서만 써야 하는 것은 아니며 리턴값을 버리는 것이 가능하다. printf함수도 출력한 문자의 개수를 리턴하며 에러 발생시 음수를 리턴하는데 에러가 발생하는 경우가 거의 없고 출력 길이에도 특별한 관심이 없으므로 보통 단독으로 사용된다.

값에 의한 호출 방식을 사용한다. 실인수가 형식인수에 대입될 때 항상 값이 대입된다는 뜻이다. 호출 방식에 대해서는 잠시 후 따로 연구해 볼 것이다.