static (정적변수)
#include <stdio.h>
void increaseNumber()
{
int num1 = 0; // 변수 선언 및 값 초기화
printf("%d\n", num1); // 변수 num1의 값을 출력
num1++; // 변수의 값을 1씩 증가
}
int main()
{
increaseNumber(); // 0
increaseNumber(); // 0
increaseNumber(); // 0
increaseNumber(); // 0: 변수가 매번 생성되고 사라지므로 0이 출력됨
return 0;
}
0
0
0
0
- num1은 increaseNumber 함수의 지역변수이므로 호출이 끝나면 사라짐
- 이를 static을 통해 사라지지 않게 할 수 있음
#include <stdio.h>
void increaseNumber()
{
static int num1 = 0; // 정적 변수 선언 및 값 초기화
printf("%d\n", num1); // 정적 변수 num1의 값을 출력
num1++; // 정적 변수 num1의 값을 1 증가시킴
}
int main()
{
increaseNumber(); // 0
increaseNumber(); // 1
increaseNumber(); // 2
increaseNumber(); // 3: 정적 변수가 사라지지 않고 유지되므로 값이 계속 증가함
return 0;
}
0
1
2
3
- 위 코드를 자세히 풀면 아래와 같음
void increaseNumber()
{ // ↓ 0
static int num1 = 0; // 프로그램이 시작될 때 정적 변수가 생성되고 초기화됨
num1++; // 0에서 1로 증가
}
void increaseNumber()
{ // ↓ 1
static int num1 = 0; // 다시 함수가 호출될 때는 값 초기화 무시
num1++; // 1에서 2로 증가
}
void increaseNumber()
{ // ↓ 2
static int num1 = 0; // 다시 함수가 호출될 때는 값 초기화 무시
num1++; // 2에서 3으로 증가
}
void increaseNumber()
{ // ↓ 3
static int num1 = 0; // 다시 함수가 호출될 때는 값 초기화 무시
num1++; // 3에서 4로 증가
}
- 이때의 num1은 정적변수이면서 지역변수임
- 정적변수인 이유: scope 밖으로 벗어나도 메모리에서 해제되지 않음
- 즉 정적변수의 의미는 메모리 해
- 지역변수인 이유: increaseNumber() 함수의 scope를 통해서만 접근 가능
- 정적변수인 이유: scope 밖으로 벗어나도 메모리에서 해제되지 않음
- 좀더 개념을 확장해서 num1을 만약 전역변수란에 선언한다면?
- 그냥 전역변수를 static 키워드 없이 선언해도 main 함수 바깥에 선언되어있기 때문에 메모리에서 해제되지 않음
- 이렇게 선언한 변수는 다른 외부 소스파일에서도
extern
키워드를 통해 접근이 가능함. 말그대로 전역변수
- 이렇게 선언한 변수는 다른 외부 소스파일에서도
- static 키워드를 붙이면 다른 파일에서는 접근 불가능. 즉 접근제한자의 역할
- 그냥 전역변수를 static 키워드 없이 선언해도 main 함수 바깥에 선언되어있기 때문에 메모리에서 해제되지 않음
// main.c
#include <stdio.h>
static int num1 = 10;
void printNumber()
{
printf("%d\n", num1); // 10: 정적 전역 변수 num1의 값 출력
}
// 같은 디렉토리의 다른 .c++ 파일
#include <stdio.h>
extern int num1; // 다른 소스 파일(외부)에 있는 정적 전역 변수는 extern으로 사용할 수 없음
// 컴파일 에러
int main()
{
printf("%d\n", num1); // 정적 전역 변수 num1의 값 출력
return 0;
}
PREVIOUS경제