오늘은 다시 이론 개념으로 지역변수와 전역 변수에 대해 이야기를 하도록 하겠습니다. 지역과 전역은 변수의 영향권이 어느 한쪽의 지역 내에서만 사용 할 수 있는지 아니면 변수가 프로그램 전체에서 사용 할 수 있는지의 차이라고 생각하시면 됩니다. 변수의 범위에 대한 개념으로 꼭 알아 두셔야 오류를 예방 할 수 있습니다. 간혹 변수를 사용 할 때 접근 범위를 착각해서 실수를 많이 하기 때문에 잘 개념을 정리해 주시기 바랍니다.
지역변수란 변수가 선언된 함수 안에서만 사용 할 수 있는 변수를 말합니다. 전역 변수는 특정 함수 안에서만 사용 하는게 아니라 모든 함수 내에서 접근하여 사용 가능한 변수를 말합니다.
예를 들어서 지역 변수와 전역 변수를 살펴 볼까요.
위 코딩에서 전역 변수는 a 이고 지역 변수는 b,c 입니다.
a는 제일 위에 상단에 main() 함수 밖에서 선언 되었기 때문에 main(), aaa()함수 안에서 a라는 변수를 접근하여 사용 할 수 있습니다. a라는 변수가 모든 함수내에서 사용 가능한 변수로 전역 변수라고 부릅니다.
b,c는 지역변수로 b은 main()함수 안에서 선언 되었기 때문에 main()함수 안에서만 사용 할 수 있는 변수 입니다. 다른 외부 함수에서는 접근 할 수 가 없죠. c도 역시 aaa()함수내에서 선언 되었기 때문에 b값이 aaa(b)함수로 값을 전달하지만 전달 받는 쪽은 int c=b로 값만 전달하지 b변수가 전달 되는 것이 아닙니다. 그래서 aaa()함수에서는 c라는 변수가 선언되고 aaa()함수 안에서만 사용 되고 main()함수나 다른 함수에서는 접근 할 수 없습니다.
이처럼 변수가 전체 함수에서 접근 가능하면 전역 변수라고 부르고 변수가 특정 함수 내에서만 접근 할 수 있으면 지역 변수라고 부릅니다.
크게 지역과 전역 변수로 구분 하였다면 이제는 세부적으로 구분해 볼 차례입니다. auto, static, extern, register 변수로 나눌 수 있습니다.
위 4가지 변수를 말로는 잘 이해가 안 될 수 있으니 실제 코딩해서 실행해 볼까요.
**[소스코드1] ** : sub.h
#include
int a = 1;
[소스코드2] : main.c
#include
#include "sub.h"
extern int a; //외부변수
void aaa(int c){ //자동변수
static int d=0; //정적 변수
a++;
c++;
d++;
printf("a=%d c=%d d=%d \n",a,c,d);
}
int main(int argc, char *argv[]) {
register int b = 10; //레지스트 변수
printf("a=%d b=%d \n",a,b);
aaa(b);
aaa(b);
system("pause");
return 0;
}
외부 변수 a는 sub.h 파일에 선언된 변수를 불러 옵니다. 그리고 이 변수는 전역 변수로서 모든 함수에서 접근이 가능합니다. print()문으로 main()과 aaa()함수에서 접근이 가능하지요.
레지스트 변수 b는 cpu 레지스트를 사용한다고 하는데 사실 눈으로 확인하기는 어렵죠. 내부 분석을 해야 겠지만 아무튼 대충 이렇게 선언해서 쓴다는 점만 이해 하세요. 거의 쓰지 않는 변수 입니다.
자동 변수 c는 일반 변수로써 aaa()함수 내에서만 접근하여 사용 하지만 c는 aaa()함수가 끝나면 소멸 합니다. 다시 재호출 되었을 때는 이전값을 가지고 있지 않습니다.
정적 변수 d는 aaa()함수 내에 접근 하는데 이 변수는 aaa()함수가 끝나면 소멸 하는 것이 아라가 다시 함수가 재호출 되었을 때 이전값을 가지고 있습니다.
aaa()함수 내에서 a, c, d++의 값의 변수를 실행 했을 때 어떻게 바뀌는지 확인해 볼까요.
[결과]
결과를 보시면 a라는 변수가 외부 변수로 불러왔는데 sub.h 파일에서 a변수에 10이 저장되어 있습니다. 그래서 호출 했을 때 a는 10을 가지고 있어서 print()문에서는 10이 출력 됩니다. 레지스터 b변수는 10으로 선언 되었기에 10이 출력 되겠죠.
다음으로, aaa()함수가 두번 호출 되는데 b값인 10을 두번 전달하게 됩니다 aaa(10)으로 c는 자동 변수로 c가 선언되고 c에는 10이 전달된 값이 저장 되겠죠. aaa() 코딩을 보면 a, c, d++이 있습니다. a는 외부 변수로 10을 가지고 있기 때문에 1이 증가하면 11이 되고, c도 10이기 때문에 1이 증가하면 11이 됩니다. d는 초기 값이 0이기 때문에 1이 증가하면 1이 됩니다. 그래서 11, 11, 1 이렇게 출력 되겠죠.
중요한 것은 그 다음입니다. aaa(10)으로 다시 재호출 되었을 때 어떻게 변하는지를 아셔야 합니다. a, c, d++ 했을 때 이전 출력 값과는 다른 값들이 출력 됩니다. 그 이유를 아셔야 합니다. a변수는 외부 변수로 aaa()함수가 끝나더라도 소멸 되지 않습니다. 그래서 이전 값을 가지고 있고 11에서 1이 증가하니 12가 됩니다. c변수의 경우는 자동(지역) 변수이기 때문에 aaa()함수가 끝나면 소멸 됩니다. 다시 재호출 되면 다시 처음 부터 c는 10이 되고 1이 증가하니 11이 됩니다. d변수는 정적 변수입니다. aaa()함수가 끝나더라도 소멸 되지 않고 계속 유지 됩니다. aaa()함수가 재호출 되었을 때 d값는 이전 값 1이 보관 되어 있기 때문에 1이 증가하면 2가 됩니다. 그래서 결과가 12, 11, 2가 나오는 것이죠.
이 차이를 확실히 이해해 주세요.
오늘은 지역 변수와 전역 변수에 대해서 알아 보았으며 auto, static, extern, register 변수로 구분하여 코딩까지 해보았습니다. 위 코딩에서 aaa()함수안에 있는 코딩을 잘 보시고 변수의 변화를 잘 이해해 주세요. 그래야 나중에 변수를 사용 할 때 실수를 줄일 수 있습니다.