79.3 정적 함수 사용하기

이번에는 정적 함수를 알아보겠습니다. 다음 내용을 프로젝트 디렉터리에 print.c로 저장하세요(반드시 프로젝트에 포함해야 합니다).

print.c

#include <stdio.h>

void print()    // print.c에서 print 함수 선언 및 정의
{
    printf("print.c\n");
}

이제 main 함수가 있는 소스 파일입니다. 다음 내용을 프로젝트 디렉터리에 main.c로 저장하세요.

main.c

#include <stdio.h>

void print()    // main.c에서 print 함수 정의
{
    printf("main.c\n");
}

int main()
{
    print();

    return 0;
}

컴파일결과

fatal error LNK1169: 여러 번 정의된 기호가 있습니다.

소스 파일 print.cmain.c에 같은 이름으로 된 함수 print를 정의했습니다. 이 상태에서 컴파일을 해보면 컴파일(링크) 에러가 발생합니다. 즉, 한 프로젝트 안에서는 함수 이름이 중복될 수 없습니다.

main.c 파일의 내용을 다음과 같이 수정하여 실행해보세요.

main.c

#include <stdio.h>

static void print()    // main.c에서 print을 정적 함수로 정의
{
    printf("main.c\n");
}

int main()
{
    print();

    return 0;
}

실행 결과

main.c

함수 print를 선언하고 정의할 때 앞에 static 키워드를 붙여서 정적 함수로 만들었습니다. 이제 컴파일 에러가 발생하지 않고 실행도 잘 됩니다.

여기서 static을 붙인 정적 함수 printmain.c 파일 안에서만 사용할 수 있습니다. 만약 print.c 파일의 print를 정적 함수로 만들었다면 print.c 파일 안에서만 사용할 수 있습니다.

그림 79-2 파일과 정적 함수의 범위

이처럼 정적 함수를 사용하면 같은 이름을 가진 함수를 파일마다 만들 수 있습니다. 따라서 정적 함수는 기능이 여러 파일로 분리되어 있을 때 각 파일 안에서만 사용하는 기능을 구현할 수 있습니다.

지금까지 정적 변수와 정적 함수에 대해 배웠습니다. 정적 변수는 값이 계속 유지된다는 점, 정적 함수는 같은 소스 코드 안에서만 호출할 수 있다는 점만 기억하면 됩니다.