C언어 초급 - 9장: 함수 (Function) (9.3 지역 변수와 전역 변수)

2025. 2. 24. 11:34프로그래밍 언어/C

9.3 지역 변수와 전역 변수

C 언어에서 변수의 범위(Scope)와 수명(Lifetime) 은 변수가 어디에서 선언되었는지에 따라 결정됩니다.
변수는 지역 변수(Local Variable), 전역 변수(Global Variable), static 변수로 나뉘며, 각각 다른 메모리 영역에서 관리됩니다.


1. 지역 변수 (Local Variable)

1.1 지역 변수란?

  • 함수 또는 코드 블록 내에서 선언된 변수.
  • 해당 함수 또는 코드 블록이 실행되는 동안만 존재.
  • 함수가 종료되면 자동으로 소멸.
  • 같은 이름의 변수를 여러 함수에서 선언할 수 있음 (독립적인 저장 공간 가짐).

1.2 지역 변수 예제

#include <stdio.h>

void printNumber() {
    int num = 10;  // 지역 변수
    printf("printNumber()의 num: %d\n", num);
}

int main() {
    int num = 20;  // 다른 지역 변수 (main 함수 내부)
    printf("main()의 num: %d\n", num);

    printNumber();  // 함수 호출

    return 0;
}

출력 결과

main()의 num: 20
printNumber()의 num: 10

📌 설명

  • main() 함수와 printNumber() 함수 내의 num 변수는 서로 다른 변수.
  • 각 함수가 실행될 때만 변수 num이 생성되고, 종료되면 사라짐.

2. 전역 변수 (Global Variable)

2.1 전역 변수란?

  • 함수 외부에서 선언된 변수.
  • 프로그램이 실행되는 동안 계속 유지됨.
  • 모든 함수에서 접근 가능 (main() 포함).
  • 프로그램 전체에서 공유되는 데이터 관리에 유용하지만,
    무분별한 사용은 변수 충돌 및 예측하기 어려운 동작을 초래할 수 있음.

2.2 전역 변수 예제

#include <stdio.h>

int globalVar = 100;  // 전역 변수

void printGlobalVar() {
    printf("전역 변수: %d\n", globalVar);
}

int main() {
    printf("전역 변수: %d\n", globalVar);
    
    globalVar = 200;  // 전역 변수 값 변경
    printGlobalVar(); // 함수 호출

    return 0;
}

출력 결과

전역 변수: 100
전역 변수: 200

📌 설명

  • globalVar은 어느 함수에서도 접근 가능.
  • main()에서 값을 변경하면 printGlobalVar()에서도 변경된 값이 유지됨.

2.3 지역 변수와 전역 변수의 차이

구분  지역 변수 (Local Variable) 전역 변수 (Global Variable)
선언 위치 함수 내부 함수 외부
유효 범위 선언된 함수 내부에서만 사용 가능 모든 함수에서 사용 가능
메모리 할당 함수 실행 시 생성, 종료 시 해제 프로그램 시작 시 생성, 종료 시 해제
사용 목적 특정 함수 내에서만 필요한 데이터 저장 프로그램 전체에서 공유할 데이터 저장

📌 전역 변수는 모든 함수에서 공유되므로, 남용하면 디버깅이 어려워질 수 있음 → 신중한 사용 필요.


3. static 변수의 개념

3.1 static 변수란?

  • 한 번만 초기화되며, 프로그램이 종료될 때까지 값을 유지.
  • 지역 변수로 선언하면, 함수가 종료되어도 값이 유지됨.
  • 전역 변수로 선언하면, 해당 파일에서만 접근 가능 (외부 파일에서 접근 불가).

📌 즉, static 변수는 데이터가 유지되지만, 접근 범위가 제한됨.


3.2 static 지역 변수

#include <stdio.h>

void countCalls() {
    static int count = 0;  // static 지역 변수
    count++;
    printf("함수가 호출된 횟수: %d\n", count);
}

int main() {
    countCalls();
    countCalls();
    countCalls();
    
    return 0;
}

출력 결과

함수가 호출된 횟수: 1
함수가 호출된 횟수: 2
함수가 호출된 횟수: 3

📌 설명

  • count 변수는 static으로 선언되어 함수 호출이 끝나도 값이 유지됨.
  • 함수가 호출될 때마다 count 값이 증가.

3.3 static 전역 변수

#include <stdio.h>

static int staticVar = 50;  // static 전역 변수

void printStaticVar() {
    printf("static 전역 변수: %d\n", staticVar);
}

int main() {
    printStaticVar();
    return 0;
}

📌 static 전역 변수는 선언된 파일에서만 접근 가능
📌 다른 파일에서 접근할 수 없음 (파일 간 변수 충돌 방지)


4. 정리

변수 유형 선언 위치 유효 범위 수명 메모리 영역
지역 변수 함수 내부 해당 함수 내에서만 사용 가능 함수 실행 시 생성, 종료 시 해제 스택(Stack)
전역 변수 함수 외부 모든 함수에서 접근 가능 프로그램 종료 시까지 유지 데이터(Data) 영역
static 지역 변수 함수 내부 해당 함수 내에서만 사용 가능 프로그램 종료 시까지 유지 데이터(Data) 영역
static 전역 변수 함수 외부 해당 파일 내에서만 접근 가능 프로그램 종료 시까지 유지 데이터(Data) 영역

📌 지역 변수는 함수 내에서만 사용 가능하고, 함수 종료 시 삭제됨
📌 전역 변수는 프로그램 종료 전까지 유지되며, 모든 함수에서 공유됨
📌 static 변수는 한 번만 초기화되고, 프로그램 종료 전까지 값이 유지됨
📌 static 전역 변수는 해당 파일에서만 접근 가능하여 변수 충돌을 방지할 수 있음