제 30강) 전역변수와 정적변수(static) |
오늘은 전역변수와 static변수에 대해 알려드리려합니다.
지역변수 |
전역변수를 보기 전에 일반적인 변수(지역변수)를 먼저 봅시다.
#include <stdio.h>
void func1(int num1)
{
int num2 = 2;
printf("%d, %d \n", num1, num2);
}
void func2(int num1)
{
int num2 = 3;
int num3 = 5;
printf("%d, %d, %d \n", num1, num2, num3);
}
int main(void)
{
int num = 5;
func1(num);
func2(num);
int num2 = 7;
printf("%d \n", num2);
return 0;
}
위의 예제를 한 번 뜯어봅시다.
이렇게 각각의 함수에 선언된 변수는 해당 함수내에서만, 또는 해당 스코프내에서만 유효하게 됩니다.
(매개변수 또한 해당 함수 내에서만 사용이 가능합니다.)
막간의 상식) 스코프(Scope) |
범위라고도 말하며 { }로 감싸여진 유효한 범위를 뜻합니다. |
그러므로 위의 예제에서 func1의 num2와 func2의 num2, 그리고 main의 num2는 전부 다른 변수가 됩니다.
전역변수 |
반면에 전역변수는 "전역"에서 사용이 가능하도록 하는 변수입니다.
#include <stdio.h>
int num2 = 0; // 전역변수
void func1(int num1)
{
printf("%d, %d \n", num1, num2);
}
void func2(int num1)
{
int num3 = 5;
printf("%d, %d, %d \n", num1, num2, num3);
}
int main(void)
{
int num = 5;
num2 = 7;
func1(num);
func2(num);
printf("%d \n", num2);
return 0;
}
위에서 봤던 예제를 살짝 바꾸어봤습니다.
3번줄이 바로 전역변수를 선언하는 줄인데요.
함수내에 선언하지 않고 소스상에 바로 선언한다는게 다른 점입니다.
이렇게 전역으로 선언된 변수는 선언된 부분 이후부터 소스코드가 끝나기 전까지 접근이 가능합니다.
이제 소스를 분석하여 봅시다.
#include <stdio.h>
int num2 = 0; // 전역변수 선언
int main(void)
{
int num = 5;
num2 = 7;
func1(num);
func2(num);
printf("%d \n", num2);
return 0;
}
3번 줄에서 우리는 이미 num2를 전역변수로 선언하였습니다.
그리고 메인함수에서 값을 7로 초기화하였습니다.
void func1(int num1)
{
printf("%d, %d \n", num1, num2);
}
void func2(int num1)
{
int num3 = 5;
printf("%d, %d, %d \n", num1, num2, num3);
}
func1과 func2에서 그렇게 7로 변경된 num2를 출력하게 됩니다.
그리하여 실행결과의 num2의 모든 값이 같게 됩니다.
변수들의 생명주기 |
위에서 지역변수와 전역변수에 대해서 알아보았습니다.
그럼 두 종류의 변수는 언제 생성되고 언제 소멸되는지 알아봅시다.
지역변수의 경우엔 위와 같은 생명주기를 가집니다.
변수가 선언되는 시점에서 생성이 되며 해당 스코프가 끝나는 지점에서 소멸하게 됩니다.
이와 달리 전역변수의 경우에는 변수가 프로그램이 종료되는 지점에서 소멸됩니다.
정적변수(static) |
지금 소개할 정적변수는 위에서 배운 지역변수와 전역변수의 특징을 둘 다 가진 변수입니다.
static 자료형 변수_이름 = 초기값;
// static 변수의 경우에는 초기값을 무조건 할당해주어야 합니다.
일반적인 변수선언과 같지만 앞에 static이 온다는 점, 그리고 무조건 초기값을 선언과 동시에 할당해주어야 한다는 점이 다릅니다.
그럼 정적변수와 지역변수, 전역변수를 동시에 비교해봅시다.
#include <stdio.h>
int global_v = 0;
void func1()
{
static int static_v = 0;
int local_v = 0;
printf("Local: %2d, static: %2d, global: %2d\n", local_v++, static_v++, global_v++);
}
int main(void)
{
for (int i = 0; i < 5; i++)
{
func1();
}
return 0;
}
위의 예제는 정적변수의 전역변수 특징을 보여주는 예제입니다.
func1 내부에 선언된 local_v는 지역변수이기 때문에 한 번 실행하고 1을 증가시켰지만 func1의 종료와 동시에 소멸되기 때문에 계속 0을 출력합니다.
하지만 static_v는 전역변수의 특징을 이용하여 전역변수처럼 값이 계속 보존 됩니다.
(프로그램 종료 시까지 보존)
하지만 접근할 수 있는 범위는 지역변수처럼 해당 스코프 내에서만 접근이 가능하기 때문에 다른 구역에서는 접근할 수 없습니다.
정적변수의 특징 |
1) 지역변수처럼 해당 스코프 내에서만 접근이 가능하다. 2) 전역변수처럼 프로그램이 종료 될때까지 값이 소멸되지 않는다. |
다음 시간에는 |
다음 시간에는 각 시간에 다루지 못했던 것을 몇개의 챕터로 나누어 다루어보겠습니다.
'Study > C언어' 카테고리의 다른 글
처음하시는 분들을 위한 C언어 기초강의 시즌2 - 32 [다루지 않았던2(Call by ~)] (0) | 2018.10.28 |
---|---|
처음하시는 분들을 위한 C언어 기초강의 시즌2 - 31 [다루지 않았던1(포인터를 이용한 함수 통신)] (0) | 2018.10.28 |
처음하시는 분들을 위한 C언어 기초강의 시즌2 - 28 [전처리기(include, define, ifdef)] (0) | 2018.10.28 |
처음하시는 분들을 위한 C언어 기초강의 시즌2 - 29 [소스파일의 분할(헤더파일)] (0) | 2018.10.28 |
처음하시는 분들을 위한 C언어 기초강의 시즌2 - 23 [메모리 구조와 메모리 할당, 배열 동적할당(malloc, realloc, calloc, free)] (0) | 2018.10.28 |