728x90

사용자가 정의한 함수

지금까지의 예제들은 표준 함수 printf()만을 사용했지만, 예제 2.3은 직접 만든 함수를 사용할 것입니다.

예제 2.3 - third.c 프로그램

// third.c -- 하나의 파일에서 두 개의 함수를 사용
#include
<stdio.h>


void call(void);

int main(void) {
    printf("call() 함수를 호출합니다. \n");
    call();
    printf("프로그램을 종료합니다. \n");

    return 0;
}

void call(void) {
    printf("call() 함수를 성공적으로 호출했습니다! \n");
}

프로그램의 출력은 다음과 같습니다.

call() 함수를 호출합니다.
call() 함수를 성공적으로 호출했습니다!
프로그램을 종료합니다.

call() 함수는 이 프로그램에서 총 세 번 나타납니다. 먼저, 함수의 프로토타입에 나오는데, 함수의 프로토타입은 사용될 함수들에 대해 컴파일러에 미리 알리는 것입니다. 그다음으로 함수를 호출하는 형태로 main()에 나타납니다. 마지막으로, call() 함수를 정의하고 있습니다. 함수를 정의하는 것은 함수의 내용을 작성하는 것입니다. 이 세 가지 형태에 대해 차례대로 살펴봅시다.

프로토타입은 C90 표준에 와서 추가된 내용입니다. 그래서 이전의 컴파일러들은 프로토타입을 인식하지 못할 수도 있습니다. 프로토타입은 어떤 함수를 사용할 것이라고 컴파일러에 미리 선언해주는 것이며, 함수 선언이라고도 부릅니다. 또한, 프로토타입은 함수의 특성 또한 포함하고 있습니다. 예를 들면 call() 함수의 프로토타입에서 call() 앞의 voidcall()이 리턴값이 없다는 것을 나타내고 있습니다. 또한, call(void)에 위치한 voidcall() 함수가 전달 인자를 사용하지 않는다는 것을 나타냅니다. 이렇게 함으로써 컴파일러가 call()을 호출할 때, call()이 바르게 사용되고 있는지를 검사할 수 있습니다. void는 "유효하지 않다"는 뜻이 아니라 "비어있다"는 뜻입니다.

오래된 C 컴파일러의 경우 다소 제한적인 형식으로 함수 선언을 지원하고 있습니다. 다음과 같이 리턴형은 작성했지만 전달 인자는 생략했습니다.

void call();

오래된 C 코드들은 함수 프로토타입을 지원하지 않아서 이와 같은 함수 선언을 사용하고 있습니다. C90, C99, C11 표준은 이 옛날 형식을 인식하고 있지만, 시간이 지나면 점차 사라질 것이라 말합니다. 그러므로 이 옛날 형식은 사용하지 않는 것이 좋습니다. 이러한 함수 선언이 소스 코드에 있다면 함수 프로토타입으로 변경해야 합니다.

그다음에, main()에서 괄호와 함께 함수의 이름을 제시함으로써, call() 함수를 간단하게 호출합니다. call()이 할 일을 끝냈을 때, 프로그램은 main()에 있는 그다음 문장으로 제어를 넘깁니다.

마지막으로, call() 함수는 함수 머리와 중괄호로 싸인 몸체를 갖고 main()과 가튼 형태로 정의되고 있습니다. 머리는 프로토타입에서 제시된 정보와 일치합니다. call() 함수는 전달 인자를 사용하지 않고, 리턴값도 없습니다. 오래된 컴파일러의 경우 괄호 안의 void를 생략하면 됩니다.

여기서 주목할 점은, 파일에서 call()이 정의된 위치가 아닌 main()에서 call()을 호출하는 위치가 call() 함수의 실행 시기를 결정한다는 것입니다. 예를 들면, 이 프로그램에서 call()의 정의를 main()의 정의보다 앞에 두어도 실행결과는 같을 것입니다. 즉, 첫 번째 printf()가 실행되고, 이어서 call() 함수가 실행된 후, 두 번째 printf() 함수가 실행될 것입니다.

또한, 모든 C 프로그램은 main()이 어느 위치에 있든지 무조건 main()부터 실행된다는 사실을 기억해야 합니다. 하지만, main()이 프로그램의 기본 골격을 제공하기 때문에 일반적으로는 main()을 맨 앞에 놓습니다.

C 표준은 사용하는 모든 함수의 프로토타입을 제공할 것을 권장합니다. 표준 include 파일들은 표준 라이브러리에서 함수들의 프로토타입을 제공합니다. 예를 들어, C에서 stdio.h 파일은 printf() 함수의 프로토타입을 갖고 있습니다.

728x90
728x90