C 언어에서 변수는 선언 위치와 키워드에 따라 동작 방식이 달라진다.
단순 문법 차이가 아니라 시스템 구조, 데이터 흐름, 디버깅 난이도까지 영향을 주는 설계 요소이다.
1. 지역 변수 (Local Variable)
지역 변수는 함수 내부에서 선언되고 해당 함수 안에서만 사용되는 변수이다.
함수 종료 시 메모리에서 사라지기 때문에 가장 기본적이고 안전한 형태이다.
사용 기준
- 함수 내부 임시 계산
- 중간 결과 저장
- 루프 제어 변수
- 외부와 상태 공유가 필요 없는 경우
특징
- 함수 호출 시 생성
- 함수 종료 시 소멸
- 외부 접근 불가
- 가장 예측 가능한 구조
실무 예시
void CalcSpeed(void)
{
uint16 tempSpeed = 0U;
tempSpeed = GetWheelSpeed() + 10U;
}
2. 전역 변수 (Global Variable)
전역 변수는 프로그램 전체 또는 여러 파일에서 접근 가능한 변수이다.
여러 모듈이 동일 데이터를 공유해야 할 때 사용된다.
사용 기준
- 여러 함수 또는 모듈에서 동일 데이터 공유
- ECU 상태 정보
- CAN 통신 데이터
- 시스템 상태 플래그
특징
- 프로그램 전체 생명주기 유지
- 접근 제한 없음
- 의존성 증가
- 디버깅 난이도 상승
실무 예시
uint8 g_IgnitionState;
uint16 g_VehicleSpeed;
전역 변수는 구조를 단순하게 만들지만, 시스템 복잡도를 증가시킨다.
AUTOSAR에서는 직접 접근보다는 RTE 또는 API 기반 접근 구조를 선호한다.
3. static 변수
static 변수는 선언 위치에 따라 의미가 완전히 달라진다.
(1) 함수 내부 static 변수 (상태 유지용)
함수 내부에서 선언되지만 함수 호출이 종료되어도 값이 유지되는 변수이다.
사용 기준
- 이전 상태 유지
- 상태 머신 구현
- debounce 처리
- 이벤트 카운트
- 필터링 로직
특징
- 함수 내부에서만 접근 가능
- 값 유지됨
- 초기화 1회 수행
실무 예시
void DebounceTask(void)
{
static uint8 stableCnt = 0U;
if (GetSignal() == 1U)
{
stableCnt++;
}
}
“이 함수가 상태를 기억해야 하는가”가 핵심 기준이다
(2) 파일 내부 static 변수 (모듈 캡슐화)
해당 .c 파일 내부에서만 접근 가능한 변수이다.
사용 기준
- 외부 접근 차단
- 모듈 내부 상태 관리
- 캡슐화 필요 데이터
특징
- 파일 외부 접근 불가
- 전역 변수보다 안전한 구조
- AUTOSAR 모듈 설계의 기본 형태
실무 예시
static uint16 g_InternalCounter;
“외부에서 접근하면 안 되는 내부 상태”에 사용된다
변수 선택 기준 (실무 설계 관점)
변수 선택은 단순 조건이 아니라 데이터 구조 설계 문제이다.
실무에서는 아래 3가지 기준으로 결정한다.
1) 데이터 소유권 (Ownership)
특정 함수만 사용 → 지역 변수
특정 모듈 내부에서만 관리 → file static
시스템 전체 공유 → 전역 또는 인터페이스 구조
핵심: “이 데이터의 주인은 누구인가”
2) 생명 주기 (Lifetime)
함수 실행 동안만 필요 → 지역 변수
호출 간 상태 유지 필요 → static (function static)
시스템 전체 유지 → 전역 또는 시스템 관리 구조
핵심: “언제 생성되고 언제 사라지는가”
3) 접근 범위 (Visibility)
외부 접근 불필요 → 지역 / static
모듈 내부 제한 → file static
외부 접근 필요 → 전역 또는 API / RTE
핵심: “어디까지 노출할 것인가”
정리
변수 종류 선택은 문법이 아니라 시스템 설계이다.
결국 핵심은 하나이다:
“이 데이터는 누가 소유하고, 얼마나 오래 유지되며, 어디까지 보여줄 것인가”
이 기준이 명확하면 변수 선택은 자연스럽게 결정된다.
'C 언어 > 실무' 카테고리의 다른 글
| C언어 함수 포인터 실무 사용법 (콜백 구조 이해하기) (0) | 2026.04.26 |
|---|---|
| C언어 switch문 실무 사용법 (if문보다 switch문이 강력한 이유) (0) | 2026.04.21 |
| C언어 구조체 실무 예제 (왜 구조체를 쓰는가?) (0) | 2026.04.15 |
| C언어 비트 연산자 쉽게 설명하기 (임베디드 실무 관점에서 제대로 이해하기) (0) | 2026.04.14 |
| C언어 extern 변수 사용법 (파일 간 변수 공유 방법) (0) | 2026.04.13 |