C언어에서 `static` 키워드는 자주 보이지만, 정확한 사용 이유를 모르고 쓰는 경우가 많다.
특히 임베디드나 AUTOSAR 환경에서는 static을 잘못 이해하면 디버깅이 어려워지고, 의도치 않은 버그로 이어질 수 있다.
이번 글에서는 C언어 static 변수의 사용 이유와 실제 코드에서 어떻게 활용되는지를 정리한다.
static 변수란?
static 변수는 프로그램이 종료될 때까지 메모리에 유지되는 변수다.
즉, 함수가 끝나도 값이 사라지지 않는다.
static 변수 사용 이유
1. 값 유지 (가장 중요한 이유)
#include <stdio.h>
void func(void)
{
static int cnt = 0;
cnt++;
printf("%d\n", cnt);
}
이 함수는 호출할 때마다 cnt 값이 증가한다.
- static 변수 → 값이 유지됨
- 일반 지역 변수 → 함수 종료 시 초기화됨
즉, 이전 상태를 기억해야 할 때 static 변수가 반드시 필요하다.
2. 전역 변수 남용 방지
static int g_value = 0;
static을 전역에 붙이면 다른 파일에서 접근이 불가하고, 해당 파일 내부에서만 사용 가능하다.
임베디드/AUTOSAR에서는 전역 변수 최소화가 기본 원칙이다.
3. 메모리 안정성 (Stack vs Data 영역)
변수 종류에 따른 메모리 위치:
- 지역 변수 → Stack
- static 변수 → Data / BSS 영역
특히 MCU 환경에서는 매우 중요하다.
static 안 쓰면 생기는 문제
문제 1: 값 유지 안됨
void func(void)
{
int cnt = 0;
cnt++;
printf("%d\n", cnt);
}
이 코드는 항상 1만 출력된다.
이유는 함수가 호출될 때마다 cnt가 초기화되기 때문이다.
문제 2: 전역 변수 남용
int g_cnt = 0;
이렇게 전역으로 쓰면 어디서든 접근이 가능해서 코드 추적이 어렵고, 디버깅 난이도도 증가한다.
버그 발생 시 원인을 찾기가 힘들어진다.
실무 예제
#include <stdint.h>
void Motor_Control(void)
{
static uint32_t timer = 0U;
timer++;
if (timer >= 100U)
{
timer = 0U;
}
}
이 코드는 주기 제어에서 많이 사용된다.
함수가 Runnable 에서 10ms 마다 계속 호출돼도 timer 값은 유지된다.
static 이 없으면 이 구조 자체가 불가능하다.
정리
static 변수는 값 유지가 필요할 때 사용한다.
전역 변수 사용을 줄일 수 있어 메모리 안정성 측면에서도 중요하다.
임베디드 시스템에서는 “상태 유지”를 위해 거의 필수 개념이다.
'C 언어 > 실무' 카테고리의 다른 글
| C언어 비트 연산자 쉽게 설명하기 (임베디드 실무 관점에서 제대로 이해하기) (0) | 2026.04.14 |
|---|---|
| C언어 extern 변수 사용법 (파일 간 변수 공유 방법) (0) | 2026.04.13 |
| C언어 배열과 포인터 차이 (헷갈리는 이유부터 핵심 차이까지) (0) | 2026.04.12 |
| C언어 포인터 쉽게 설명하기 (개념부터 실무 예제까지 한 번에) (4) | 2026.04.11 |
| C언어 volatile은 언제 써야 하는가? (0) | 2026.04.11 |