8-1.수학 함수

8-1-가.표준 함수

C컴파일러는 많은 수의 표준 함수들을 제공한다. 공통적으로 자주 사용되는 기능들을 모든 개발자들이 직접 만들어 쓴다면 시간도 많이 걸릴 것이고 사회적인 낭비도 심할 것이다. 모든 개발자들이 화면 입출력을 위해 printf, scanf 같은 함수를 일일이 만들어 써야 한다면 얼마나 끔찍하겠는가? 이런 함수들의 기능은 워낙 뻔하기 때문에 누가 만들어도 비슷한 모양을 가질 것이며 어떤 특수하고도 고유한 기능을 요구하는 것도 아니다.

물론 실력이 되고 시간이 펑펑 남아 돈다면 자신의 필요에 맞게 원하는 기능만 가지는 함수를 입맛에 맞게 만들어 쓰는 것도 가능하다. 그러나 아무래도 직접 만든 함수는 성능이 떨어질 것이고 충분한 테스트를 거치지 않았기 때문에 어떤 상황에서라도 잘 동작할 수 있는 신뢰성을 갖추기 어렵다. 뿐만 아니라 사람들마다 쓰는 함수가 제각각이면 공동 프로젝트를 하기도 어려워진다. 요구되는 기능이 명확하므로 똑똑한 누군가가 한 번만 잘 만들어 놓고 이 함수를 같이 사용한다면 모든 사람들이 해피해질 것이다.

그래서 컴파일러 제작사들은 자주 사용되는 공통적인 함수들을 미리 만들어서 컴파일러와 함께 배포하는데 이를 표준 함수라고 하며 표준 함수들의 집합을 런타임 라이브러리(CRT)라고 부른다. 컴파일러 제작사의 우수한 프로그래머들이 공들여 작성한 것이므로 성능이 뛰어남은 물론이고 오랫동안 다양한 프로젝트에서 테스트되었기 때문에 신뢰성도 높다. 그래서 우리는 원하는 기능을 제공하는 표준 함수를 골라 호출하기만 하면 된다. 이 얼마나 고마운 일인가?

초창기의 C언어가 설계될 때의 컴퓨터 환경은 무척 열악했었다. CPU 속도나 메모리 용량 등이 지금과는 비교가 되지 않을 정도로 느리고 좁았기 때문에 이런 환경에서 실행되는 프로그램을 만들어야 하는 C언어는 가급적 작게 디자인할 수밖에 없었다. 그래서 다른 언어와는 달리 기본적인 화면 입출력조차도 언어 차원에서 지원하지 않았으며 모든 것들을 함수로 만들어 쓰기로 한 것이다. C 컴파일러를 만드는 제작사들은 사용자가 필요로 하는 함수들을 제공했었는데 한동안은 이런 함수들이 통일되지 못하는 혼돈의 시대가 이어졌다.

이런 혼돈을 깔끔하게 정리한 표준이 바로 89년에 제정된 ANSI C 표준이며 이 시점에서 그동안 무분별하게 추가되었던 함수들이 통폐합되어 지금에 이르게 된 것이다. ANSI C 표준은 C 컴파일러가 제공해야 하는 함수의 목록과 원형, 그리고 구체적인 기능까지도 규정하고 있으므로 이 표준을 따르는 컴파일러는 반드시 표준이 지정한 바대로 라이브러리를 제공해야 하는 의무를 지며 사용자들은 이식성을 걱정할 필요없이 표준 함수를 자유롭게 사용할 수 있게 되었다.

표준은 필요한 함수의 최소한의 목록만을 규정하며 컴파일러 제작사는 필요에 따라 함수를 더 추가로 정의할 수도 있다. 그래서 컴파일러 제작사에 따라 런타임 라이브러리의 구성이 조금씩 달라질 수 있으므로 약간의 주의를 기울일 필요는 있다. 예를 들어 터보 C에는 gotoxy, clrscr 함수들이 있지만 비주얼 C++에는 이 함수들이 없으며 같은 함수라도 이름이 조금씩 다른 경우도 있다. 하지만 printf, puts, getch 같은 기본적인 함수들은 대부분의 컴파일러에 공통적으로 존재하므로 컴파일러에 상관없이 자유롭게 사용할 수 있다. 표준 함수들은 기능에 따라 다음과 같이 분류할 수 있다.

 

분류

함수

입출력 함수

printf, scanf, gets, puts, getch, putch

수학 함수

sin, cos, tan, pow, floor, ceil, hypot

문자열 함수

strcpy, strlen, strcat, strstr, strchr

시간 함수

time, asctime, clock

파일 입출력 함수

fopen, fclose, fseek, fread, fwrite

프로그램 제어

exit, abort, system

메모리 할당

malloc, free, realloc, calloc

기타

rand, delay

 

printf, scanf 같은 기본적인 입출력 함수들은 그동안 실습을 하면서 이미 많이 써 왔고 사용 방법도 잘 알고 있을 것이다. 문자열 함수나 파일 입출력 함수들은 다음에 천천히 배우기로 하고 여기서는 수학 함수와 시간 함수 등에 대해서만 중점적으로 알아보도록 하자. 이미 작성되어 있는 함수의 사용법을 설명하는 것이므로 그다지 상세할 필요는 없을 것 같고 함수의 목록을 나열하는 식으로 간략하게 소개만 하기로 한다.

이후 여러분들은 C언어뿐만 아니라 API나 MFC, DB, 네트워크 등을 공부하면서 수많은 함수들을 만나고 공부하게 될텐데 함수를 익힐 때는 암기 위주로 공부를 하는 것보다 어떤 함수들이 제공되는지 목록을 파악하고 함수의 기능을 구경해 본다는 가벼운 마음으로 임하는 것이 좋다. 어차피 그 많은 함수를 머리속에 다 넣고 다닐 수는 없는 노릇이므로 항상 레퍼런스를 참고하는 습관을 가지도록 하자. 레퍼런스는 일종의 함수 사전이다.