static 함수

Language/C 2011. 8. 23. 10:52

static의 원초적인 목적은 함수내에서 선언되어 그 함수가 return되었다가 
다시 그 함수가 불리워도 그 변수가 값을 유지하고 있도록 하기 위함입니다.


그런데 이런 static 변수는 기본적으로 해당 프로그램이 초기화될때
메모리에서 제일 먼저 만들어두는게 규칙이죠. 그래서 이 변수가 원래의 목적과 다르게 
Global 변수를 선언할 때 static을 선언하는 것처럼 오용되어 변질되어 왔습니다.

사실 Global은 static선언과 관계없이 처음부터 끝까지 존재하니까요.   
더 엄격히 말하면 static이 붙은 변수가 속한 범위(코딩 내부구조에 따른 유효범위)내에서만 
계속 값이 유지된다는 의미입니다.

static이 함수에 붙었다고 해서 같은 파일이어도 컴파일되고 하는 것은 단순히 그 현상일 뿐입니다
static이 어떤 파일에 존재하는 함수에 붙은 경우, 
특히 c경우에는 함수는 함수가 기록된 파일 자체가 범위가 되는 것입니다.

어떤 클래스이든, 변수이든, 그것이 static으로 선언되었을 때에는 그 선언된 클래스나 변수가 
기본적으로 어떠한 상황이든 값이나 기능을 메모리에 계속해서 유지하고자 함이라는 
기본적인 static의 목적을 명심하시고, 
이 경우 해당 유효범위내에서 메모리에 제일 먼저 생성되고 초기화되어 존재하는 것이라는 것만
생각하시면 됩니다.

여기에서 파생된 여러가지 현상을 이해하면 
좀더 static 선언의 의미를 확실히 알수 있을 것 같습니다. 
또한 static 선언을 남발하지 않고 정확하게 사용할 수 있지 않을까요? 
물론 현재 윈도우 프로그램이 메모리에 비교적 자유롭게 한다지만 
아무래도 메모리를 간결하게 사용하는 것이 프로가 아닐까 생각합니다

출처 : http://blog.naver.com/focet55/130013495793



이 키워드가 변수가 아닌 함수 앞에 붙게됨녀 이 함수가 선언된 파일 안에서만 함수를 호출할 수 있다는 의미이다.

다음과 같이 3개의 파일 이 존재한다고 할때 

file1.c

static void func(void)
{
//printf("file1 \n");
}

file2.c
void func(void)
{
//printf("file2 \n");
}
main .c 파일 파일에서는

extern void func(void)



void main(void)
{
func();
}


func 라는 함수가 두개 있으므로 컴파일러는 컴파일 에러가 있음을 경고한다. 그러나 위와 같이 static 이란 키워드로 정의되어 있다면
컴파일 에러가 발생하지 않게된다. 
왜냐하면 fil1 에 잇는 func 라는 함수는 file1.c 에서만 호출 될수 있기 때문이다. 그렇기 대문에 두 main 에서 extern 으로 호출 한 func 는
당연히 fil2 에 들어잇는 함수이다. 

'Language > C' 카테고리의 다른 글

[Linux/Unix]make 명령 코드 구현하기  (0) 2011.08.23
make (Makefile)  (1) 2011.08.23
gcc 컴파일 과정  (0) 2011.08.23
Pthread API Reference  (0) 2011.08.23
static 전역 변수  (0) 2011.08.23
: