반응형
C 언어에는 접근 한정자가 없기 때문에 변수의 가시성을 잘 관리해야 한다
특히, 전역 변수를 남발해서 사용하면 스파게티 코드가 될 여지가 있어 적절한 설계가 필요하다
C에서 전역 변수를 남용하면 발생하는 문제는 다음과 같다
- 모든 함수에서 접근 가능 → 코드 의존성이 높아지고 디버깅이 어려워짐
- 동시 수정 가능성 증가 → 여러 함수가 동일한 전역 변수를 수정하면 예측하기 어려운 버그 발생 가능
- 캡슐화가 어렵다 → 객체지향 언어처럼 데이터 보호가 불가능
따라서 이러한 문제들을 해결하기 위하여, 정적 변수 등을 활용하는 방법을 사용한다
========= config.h =========
#ifndef CONFIG_H
#define CONFIG_H
/* 전역 변수처럼 보이지만, 파일 내부에서만 사용 가능 */
static int s_app_mode = 1;
/* getter, setter 함수 제공 */
int get_app_mode(void);
void set_app_mode(int mode);
#endif /* CONFIG_H */
========= config.c =========
#include "config.h"
/* s_app_mode를 접근하기 위한 함수 */
int get_app_mode(void)
{
return s_app_mode;
}
void set_app_mode(int mode)
{
s_app_mode = mode;
}
========= main.c =========
#include <stdio.h>
#include "config.h"
int main(void)
{
printf("Current Mode: %d\n", get_app_mode());
set_app_mode(2);
printf("Updated Mode: %d\n", get_app_mode());
return 0;
}
위와 같이 전역 변수를 외부에서 직접 수정하지 못하도록 막고, getter/setter를 통해 접근하도록 제한하였다
또한 함수 또한 static으로 선언해서 private 접근 한정자 처럼 사용할 수 있다
========= config.h =========
#ifndef CONFIG_H
#define CONFIG_H
int get_app_mode(void);
void set_app_mode(int mode);
#endif /* CONFIG_H */
========= config.c =========
#include "config.h"
/* 파일 내에서만 접근 가능한 정적 변수 */
static int s_app_mode = 1;
/* 파일 내에서만 사용하는 정적 함수 */
static void log_mode_change(int new_mode)
{
printf("[LOG] Mode changed to: %d\n", new_mode);
}
/* 외부에 노출되는 인터페이스 */
int get_app_mode(void)
{
return s_app_mode;
}
void set_app_mode(int mode)
{
s_app_mode = mode;
log_mode_change(mode); // 내부 로깅 처리
}
========= main.c =========
#include <stdio.h>
#include "config.h"
int main(void)
{
printf("Current Mode: %d\n", get_app_mode());
set_app_mode(2);
printf("Updated Mode: %d\n", get_app_mode());
return 0;
}
핵심은 접근 한정자를 응용하듯이 최대한 변수를 사용 가능한 범위를 줄여 코드에 의도를 담는 것이다
Reference
'프로그래밍 > C, C++' 카테고리의 다른 글
C 언어 배열 (0) | 2025.04.09 |
---|---|
C 언어 함수 (0) | 2025.04.08 |
C 언어의 bool 형 (0) | 2025.04.08 |
C 역참조 연산자(*)와 주소 연산자(&) (0) | 2025.04.08 |
C #include 지시문과 헤더 파일, 인클루드 가드 (0) | 2025.04.08 |