티스토리 뷰

C언어 extern 변수와 static 변수의 차이점 그리고 함수는?

처음 C프로그래밍을 배우다 보면 extern, static 변수와 함수의 사용에 있어서 어떤 때는 extern을 써야하고 어떤 때는 static을 써야하는지 좀 헷갈립니다. 그래서 오늘은 전역(extern)과 지역(static) 변수와 함수에 대해 이야기를 해볼까 합니다.

정말 어처구니 없는사무실 책상.... 헐.....ㅡ..ㅡ;;;;;

전역변수와 지역변수

c언어에서 함수안에서 선언된 변수를 지역 변수라고 부릅니다. 이를 지역변수라고 부르는 이유는 이 변수가 선언된 함수 안에서만 값을 참조하거나 변경할 수 있기에 그렇습니다. 그러면 여러 함수들이 공통으로 쓸 수 있는 변수도 있을텐데요. 그게 바로 전역(extern) 변수입니다. 전역 변수로 선언 하는 방법은 함수 밖에서 선언을 하면 되고요. 그러면 여러 함수들에서 그 변수의 값을 참조하고 변경할 수 있습니다. 그런데 만약 여러개의 파일로 이루어진 프로그램에서 다른 코드파일에 선언된 전역변수를 참조하려면 어떻게 해야할까요?

extern과 static의 차이

extern으로 변수를 선언하면 다른 파일에서 그 변수를 사용할 수 있습니다. 가령 A파일에서 int temp = 0; 라고 선언한 뒤 B파일에서 extern int temp; 라고 참조 선언을 하면 B파일의 어느 곳에서든 temp 전역변수에 대한 접근과 변경이 가능합니다. 전역변수는 기본으로 extern이기 때문에 A파일의 int temp = 0; 선언은 extern int temp = 0;와 동일합니다. 이렇게 함으로써 extern 전역변수에 대한 정의와 초기화가 된 것입니다. 초기화가 없는 B 파일의 extern int temp; 선언은 '참조선언'으로서 다른 파일에서 전역변수를 찾아서 있으면 그것을 가져다 쓰겠다는 의미로 봅니다.

이렇게 extern 전역변수를 선언하여 여러 파일에서 쓰다보면 한 파일내에서만 쓰고 싶은 전역 변수도 생길 것입니다. 그러한 경우에 쓰는 것이 static 전역변수입니다. 선언 방법은 static int temp;와 같이 쓰면 되고요. 정리하자면 여러 파일에서 공유해서 쓰고자 할 경우에는 extern, 한 파일내에서만 쓰고 싶은 경우는 static 입니다. 함수도 마찬가지고요.

추가

extern 함수 : 기본적으로 함수는 extern으로 선언됩니다. 만약 다른 파일에서 동일한 함수 이름을 쓰면 재정의 오류란 녀석이 떵!!!~ 하고 나타나죠.


extern 함수 : extern 참조 선언을 함수 밖이 아닌 함수 내에서도 할 수 있는데요. 그럴 경우에는 컴파일러가 다른 파일에서 해당 extern 변수가 선언이 되어 있는지 아닌지 검사하지 않으므로 컴파일시에 에러가 나지 않습니다. 고로 주의해서 사용해야 합니다. 선언되어있지도 않은 변수를 쓰면 어떤일이 발생할지 아무도 모르죠.