JollyTree의 C언어 기초코딩: 예제로 간단 정리 - 7. 전역변수(Global Variable)와 지역변수(Local Variable) 그리고 변수의 특성(feat. 함수)
정리 내용 요약
- 변수의 범위, 유형, 속성, 생존 시간 - static, extern 키워드를 지정한 함수와 변수 선언 방법 |
안녕하세요 JollyTree입니다 (•̀ᴗ•́)و
전역 변수와 지역변수
변수는 선언 위치와 유형에 따라 전역변수, 지역변수로 분류되며 적용 범위와 생존시간이 다르게 적용됩니다. 전역변수는 프로그램이 실행되는 동안 지속적으로 메모리에 저장되어 프로그램이 종료될 때까지 프로그램에 적용되며 지역변수는 블록 내부 또는 함수 내부에서만 생존하는 변수로 함수나 중괄호('{', '}')로 되어 있는 블록이 끝나면 소멸됩니다.
그럼 예제로 정리해 보겠습니다. 소스코드 중간중간에 주석을 달았놓았으니 참고하세요.
전역 변수와 지역 변수 예제:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
#include <stdio.h>
/* 함수 밖에 선언되어 있으므로 전역변수(Global Variable)
*/
int z = 789; //전역변수 초기화
int global_counter = 0; //전역변수 초기화
void global_inc(int a)
{
global_counter = a;
}
int add(int a, int b)
{
/* add 함수 블록 안에 선언되어 있으므로 지역변수(Local Variable)
*/
int result;
result = a + b;
return result;
}
int inc(int count)
{
//파라미터도 지역변수로 분류
count++;
return count;
}
int main()
{
//메인함수 블록 안에 선언되어 있으므로 지역변수(Local Variable)
int a;
int c = 20;
printf("%d\n", add(10, 20));
{
int b; //지역변수
int r; //지역변수
a = 20;
b = 30;
r = add(a, b);
printf("a + b = %d\n", r);
}
//b = 50; //범위를 벗어났기 때문에 컴파일 오류 발생(error C2065: 'b': undeclared identifier)
for (int i = 0; i < 5; i++)
{
int j = 0; //지역변수로 반복할 때마다 0으로 초기화
printf("i + j = %d\n", i + j); //i는 for()내에서 계속 생존하므로, +1씩 증가
j++;
}
//inc() 함수의 파라미터인 int count도 지역변수에 속함
printf("\n>> 함수 호출 전의 지역변수: %d\n", c);
inc(c);
inc(c);
//그래서, 결과가 누적되지 않고 함수 호출 전과 후의 값이 동일함 printf(">> 함수 호출 후의 지역변수: %d\n", c); //전역변수의 테스트
global_counter = global_counter + 1;
printf(">> 전역변수 global_counter = %d\n", global_counter);
global_inc(50);
printf(">> 전역변수 global_counter = %d\n", global_counter);
return 0;
}
|
cs |
실행결과(Output):
49번째 라인의 b = 50은 b가 선언된 {...} 블록을 벗어났기 때문에 컴파일 도중에 컴파일러에 의해 다음과 같은 에러가 발생합니다. 그래서 실행을 위해 주석 처리하였습니다.
- error C2065: 'b': undeclared identifier
만약 int a;와 같이 동일한 이름의 전역변수와 지역변수가 존재한다면 지역변수가 선언된 해당 블록에서는 전역변수는 무시되고 해당 블럭의 지역변수를 우선 참조합니다. 아래 코드에서 지역변수 int result를 0으로 초기화 하면 전역변수 int result에는 영향을 주지 않습니다.
int result = 123; //전역변수
int main()
{
int result = 0; //지역변수
}
정적 변수와 함수(static variable & function)
위 예제를 통해 전역변수와 지역변수의 생존 주기를 알아보았습니다. 일반적으로 지역변수는 블록이 종료되면 소멸되지만, static 키워드를 사용하면 소멸되지 않습니다. 아래 예제는 func()라는 함수를 만들어서 지역변수 static int static_count = 0;과 같이 자료형 앞에 static 키워드를 지정하였습니다. 어떻게 달라지는지 궁금하여 정리해 보았습니다.
지역변수와 정적변수의 차이점을 보여주는 예제:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
#include <stdio.h>
int add(int a, int b)
{
static int result; //정적 변수
result = a + b;
return result;
}
void func(void)
{
int count = 0; //일반 지역 변수
static int static_count = 0; //지역 변수
count = count + 1;
static_count = static_count + 1;
printf("(일반 변수) count = %d\n", count);
printf("(static 변수) static_count = %d\n", static_count);
}
int main()
{
int i; //일반 지역 변수
for (i = 0; i < 10; i++)
func();
{
int a; //일반 지역 변수
static int r; //
a = 200;
}
//r = 50; //static을 사용해도 컴파일 범위를 벗어났기 때문에 컴파일 오류가 발생
return 0;
}
|
cs |
실행결과(Output):
실행된 결과를 살펴보면 일반적으로 선언된 count 변수는 변수의 생존 범위가 func() 함수 내부에만 국한되어 있어 main()함수에서 반복적으로 func()함수를 호출해도 계속 동일 한 1이 출력되지만, static 키워드를 지정한 static_count는 계속 누적되어 적용 범위가 main()함수 영역까지 넓혀진 것을 알 수가 있습니다.
참고 static 이 외에도 변수 앞에 유형을 지정할 수 있는 키워드는 auto, register가 있습니다. 일반적인 지역변수는 int a; 라고 선언하면 내부적으로 auto 키워드를 지정한 것과 동일한 결과를 얻습니다. register int a; 라고 register 키워드를 지정하면 흔히 RAM이라 부르는 메모리 영역이 아닌 CPU의 레지스터에 변수를 저장하게 되어 처리 속도가 빠르다는 장점이 있습니다. 하지만 하드웨어인 CPU 내의 레지스터 수는 한정되어 있어 register 키워드로 변수를 지정해도 모두가 register 형태로 지정되는 것은 아닙니다. |
static 키워드는 함수에도 적용이 가능합니다. 다음에는 여러 개의 소스코드 파일을 만들어서 static, extern 키워드를 적용한 변수와 함수를 예제로 포스팅 하겠습니다.
이상 JollyTree였습니다 (•̀ᴗ•́)و
'Coding & Programming > C언어 기초(A-Z)' 카테고리의 다른 글
[C언어 기초코딩: 예제로 간단 정리] 7.전역변수(Global Variable)와 지역변수(Local Variable) 그리고 변수의 특성(feat. 함수) - static, extern 자료 추가 (0) | 2021.03.15 |
---|---|
[C언어 기초코딩: 예제로 간단 정리] 8.배열(array) (0) | 2021.03.14 |
[C언어 기초코딩: 예제로 간단 정리] 6. 함수(Function) (0) | 2021.03.11 |
[C언어 기초코딩: 예제로 간단 정리] 5. 반복문(Loops) - 예제 추가 (0) | 2021.03.10 |
[C언어 기초코딩: 예제로 간단 정리] 5. 반복문(Loops) (0) | 2021.03.09 |