C언어는 함수형 언어이다. 모든것이 함수로 이루어져 있다는 뜻이다. 자세히 알아보자.

함수는 수학적으로는 집합A와 집합B가 정해져 있을 때, 다음과 같이 정의한다.
A의 원소에 B의 원소를 짝지어서 (a,b)로 쓴다. 이 경우, 모든 (a,b)의 집합의 어떤 부분집합 f는 함수이다.
만약, B의 임의의 원소 b에 대해서 (a,b)가 존재하면 f는 전사함수(surjective function, surjection)라고 부른다. 만약, B의 원소 b가 결정되었을 때, (x,b)를 만족하는 x를 모아둔 A의 부분집합의 원소가 1개뿐이면 f는 단사함수(injective function, injection)이다. 그리고 전사함수이면서 단사함수이면 전단사 함수(bijection)라고 부른다. 이건 고등학교때 배우는 쉬운 내용이므로 넘어가자.
수학적으로는 그런데, 좀 어렵다. 따라서, 좀 쉽게 정해보자. 위와 똑같은 얘기를 아래와 같이 쉽게도 할 수 있다.
a는 A의 원소이고 b는 B의 원소라고 하자. 만약 a를 결정했을 때 그와 관련된 b를 알 수 있으면, 그런 규칙은 함수라고 부른다.
만약 모든 B의 원소가 A에 있는 적어도 한 원소와 관련되는 함수는 전사함수이다. 만약 B의 어떤 한 원소로 오는 A의 원소가 유일하게 결정된다면, 그런 함수는 단사함수이다. 둘 다 되면 전단사 함수이다.
여전히 어려운가? 상관없다. C언어의 함수를 배우는데는 아무런 문제가 되지 않는다. C언어에서의 함수는 아주 간단하다.
type 함수이름(변수1, 변수2...){
함수가 할 일
return 되돌려줄 변수;
}
이런식으로 함수를 만든다. type은 int, float, double, char, void 등이 있으니 맘대로 골라쓰자. void는 return할게 없을 경우에 사용한다. 물론 입력받을게 없는 함수도 만들 수 있다. 변수에 아무것도 쓰지 말고 void만 써주면, void는 "아무것도 없다"는 걸 알게 해준다. 이런식으로 기능을 함수로 쪼개는 것은 상당히 재미있다.

내가 이 얘기를 하는 이유는, 함수라고 부르는 대상이 상당히 재미있는 일을 해주기 때문이다. 가령, 숫자 두개를 받아서 더하여 출력하는 함수가 있다고 해 보자. 그럼 함수는 변수 2개를 입력받고, 내부적으로 적당히 처리해서, 출력을 해주면 된다. 이 사실을 알려주는 것을 선언이라고 한다. 선언은 함수의 정의와는 다른데, 정의는 함수가 무슨 일을 하는지 정확히 다 알려주는 것이지만, 선언은 그냥 변수를 무엇을 받고 결과를 어떻게 내보내는지만 말해준다. 그리고, 선언과 정의를 동시에 할 수도 있다. 중요한 것은, 함수의 정의는 어디에 있어도 상관 없지만, 선언은 그 함수가 최초로 쓰이기 전에 반드시 존재해야 한다는 점이다.
이것은 솔직히 말하면 귀찮은 작업이긴 하다. 하지만 귀찮은 것을 신경쓰지 않는다면, 재미난 것을 해볼 수가 있다.
double add(double,double);

이런 식으로 선언을 했다고 하자. add라는 함수는 실수 두개를 받아서 실수를 출력하는 함수가 된다. 그럼 정의는?
double add(double a, double b){
    double c=a+b;
    return c;
}

이런식으로 쓸 수가 있다. 중요한건, return해주는 변수 c는 처음에 add를 정의할때 사용한 double과 같은 타입을 갖고 있어야 한다는 점이다. 이것만 주의하면 된다. 만약 add를 좀 다른 방법으로 계산하고 싶다면, 다르게 정의하면 된다.
double add(double a, double b){
   double c=a+2*b+3.0;
   return c;
}

이렇게 하면 우리가 원하는대로 add라는 함수가 정의된다. 아무 상관 없다.

C언어에서 알고리즘은 그래서 함수가 어떤 기능을 하는지, 그리고 그 함수를 이용해서 또다른 함수를 어떻게 만들지 고민하는 과정이라고 보면 되겠다. 그런점에서 C언어는 상당히 수학적으로 구성할 수 있는 언어라고 생각한다.

수학은 최초에 무정의 용어와 그 무정의 용어의 사용법에 대한 공리Axiom가 있어야 한다. 그리고 그 공리와 무정의 용어를 이용해서 다른 정리들을 증명해 간다. C언어는 함수가 사용되기 전에 선언되지 않으면 사용할 수 없다. 그리고 선언되기만 하고 정의되지 않으면 사용할 수 없다. 수학에서도 알려지지 않은 정리는 사용할 수 없으며, 추측으로 그럴듯해 보이더라도 기존의 정리들로부터 증명되지 않으면 사용할 수 없다. C언어에서 무정의 용어와 공리계에 해당하는 것은 standard C의 문법 체계와 기본적인 라이브러리에 해당할 것이다.

by snowall 2007. 2. 27. 14:29