본문 바로가기
프로그래밍/C, C++

C 언어에서 전역/지역 변수를 어떻게 활용할 것인가?

by argentdarae 2025. 4. 8.
반응형

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

Storage-class specifiers - cppreference.com

'프로그래밍 > 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