2013년 5월 22일 수요일

static 와 extern 의 차이


3.1 static


static(정적)함수는 소스 코드에서 은폐성을 높이기 위해 매우 중요한 요소이지만, 널리 알려져
있지 않은 단어라고 할 수 있다.


만약 2. 선언에 있는 소스코드 중에서 init.c의 코드의 정의를

static void init(){...}

와 같이 static을 붙이면 어떻게 될까? 그렇다 함수의 선언 및 정의에 static을 붙일 경우에는
해당 함수의 접근은 해당 파일내로 제한하게 된다. inic.c에 static을 붙이고 컴파일을 할 경우에

는 해당 함수가 정의되지 않았다는 메시지와 함께 에러가 발생하게 된다.

다시 말하면, 함수를 static으로 정의하면 그 파일 내에서만 통용되는 완전한 지역(local)함수로 

취급할 수 있으며, 아래와 같은 이점이 있다.

다른 파일과 함수명의 충돌이 있을지 걱정하지 않아도 된다.

다른 파일에서는 그 함수를 호출하지 않는 것이 보장된다.


3.2 extern


아래와 같은 함수가 있으면,
int Test(int i)
{
     return i;
}


함수 Test는 외부에 공개 되어있으며 다른 파일에서의 접근이 허용이 된다는 의미가 된다.

즉 외부함수 또는 전역함수라는 말이 된다.

만약 다른 소스파일에서 Test함수를 호출하려고 할때, 해당 파일 내에서는 함수 Test함수의 인

자와 반환형식을 알고 있어야되는데 이때 extern을 붙여주면 된다.
extern int Test(int i);
또는
int Test(int i); // extern 생략 가능

함수의 경우에는 default로 전역함수가 되므로 extern은 생략해도 된다.

3.3 변수에 대한 static & extern



변수의 경우에도 함수와 마찬가지로 파일 외부로 공개 유무에 따라서 static 또는 extern을 사용한다.


하지만 여기에는 함수에서 사용할때와는 조금 차이가 있으니 확인하도록 하자.


아래와 같이 함수내에서 static을 사용했을 경우에는 범위는 함수안에서만 유효범위가 된다. 함수 외부에서의 접근은 거부 된다. 
void Test()
{
    static int test_value = 0;
    int test = 1;
}

이외의 static이 붙은 변수와 함수내의 지역변수와의 차이점은 C언어 기본서를 참고하기 바란다.

함수외부에서 선언된 static변수의 경우는 해당 파일내로 접근 범위가 제한이 되며, 외부에서의 접근을


할 수 없다.
static int test = 1;
int GetValue()
{
return test;
}

void SetValue(int value)
{
test = value;
}


외부에서 접근이 제한되므로 Get/Set함수를 통해서 해당 변수를 제어하도록 하자.


변수의 경우도 extern을 선언함으로써 다른 파일에서 정의된 변수의 형식을 컴파일러에게 알려줄 수 있다.
extern int test;

int main()
{
printf("Value: %d\n", test);
return 0;
}


위와 같이 extern을 붙여 주어서 외부에 선언된 변수가 있다는 것을 알릴수 있다. 하지만 해당 변수에


static형일 경우에는 해당 변수를 발견할 수 없다는 메시지와 함께 에러가 발생하게 된다.


아래는 변수 공개의 예제 코드이다.


<test.c>
int test = 1;


<main.c>
#include <stdio.h>

extern int test;
int main(void)
{
printf("Test Value: %d\n", test);
return 0;
}


3.4 참고
변수

static: 변수 정의(파일 외부에 공개하지 않음)
없음: 변수 정의(파일 외부에 공개함)
extern: 변수 선언(정의는 없음)
함수 정의

static: 파일 외부에 공개하지 않음
없음: 파일 외부에 공개함
extern: 파일 외부에 공개함
함수의 원형 선언

static: 공개하지 않는 함수의 원형 선언(같은 파일내에)
없음: 공개하는 함수의 원형 선언
extern: 공개하는 함수의 원형 선언


< 참고: 쉽게 배우는 C프로그래밍 테크닉(p51) >

댓글 없음:

댓글 쓰기