Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C 언어 변수의 범위(Scope)와 저장 클래스 완벽 이해하기

C 언어에서 저장 클래스(Storage Class)는 변수의 범위(scope), 생존 기간(lifetime), 그리고 연결(binding)을 결정하는 중요한 요소입니다.

변수를 완전하게 정의하려면 자료형(type)뿐만 아니라 저장 클래스까지 함께 명시해야 합니다. 변수 이름은 컴퓨터 메모리 내의 특정 물리적 위치를 식별하며, 그 위치에는 변수의 값을 저장하기 위한 비트들이 할당됩니다.

저장 클래스가 알려주는 정보

저장 클래스를 통해 다음과 같은 사항들을 파악할 수 있습니다.

  • 변수가 어디에 저장되는가? (메모리 또는 CPU 레지스터)
  • 아무것도 초기화하지 않았을 때 변수의 초기값은 무엇인가?
  • 변수의 범위는 어디까지인가? (프로그램의 어느 부분에서 접근 가능한가?)
  • 변수의 수명은 얼마나 되는가?

범위(Scope)란 무엇인가?

범위(scope)는 객체의 가시성(visibility)을 정의하는 개념으로, 프로그램 내에서 해당 객체에 어디서 접근할 수 있는지를 나타냅니다. C 언어에서 변수의 범위는 크게 지역(local)전역(global) 두 가지로 나뉩니다.

  • 지역 변수: 블록({ }) 내부에서 정의된 변수로, 해당 블록 안에서만 접근할 수 있습니다.
  • 전역 변수: 전역 영역에서 정의된 변수로, 정의된 시점부터 프로그램이 종료될 때까지 프로그램 전체 어디에서든 접근할 수 있습니다.
구분지역 변수전역 변수
정의 위치함수 또는 블록 내부모든 함수 외부(전역 영역)
접근 범위정의된 블록 내부에서만 가능정의 시점부터 프로그램 전체
생존 기간블록 실행 동안만 유지프로그램 종료 시까지 유지

예제 1: 변수의 범위 확인하기

다음은 변수의 범위를 보여주는 C 프로그램입니다.

#include <stdio.h>

int c = 30; /* 전역 영역에 선언된 변수 */

int main(void) {
    int a = 10; // 지역 범위를 갖는 변수
    printf("a=%d, c=%d\n", a, c);
    fun();
    return 0;
}

void fun(void) {
    printf("c=%d\n", c); // 전역 변수에 접근
}

실행 결과

위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.

a = 10, c = 30
c = 30

함수 fun() 내부에는 변수 c가 선언되어 있지 않지만, 전역 변수 c에 접근하여 값 30을 출력하는 것을 확인할 수 있습니다.

예제 2: 지역 변수와 전역 변수의 활용

다음은 지역 변수와 전역 변수를 함께 사용하는 C 프로그램입니다.

#include <stdio.h>

int a = 1, b = 2; // 전역 변수

int main(void) {
    int c, d; // 지역 변수
    printf("c와 d 값 입력: ");
    scanf("%d%d", &c, &d);
    c = c + d; // 지역 변수 연산
    b = a * b; // 전역 변수 연산
    printf("c 값은: %d\n", c);
    printf("b 값은: %d\n", b);
    return 0;
}

실행 결과

위 프로그램을 실행하고 4와 7을 입력하면 다음과 같은 결과가 출력됩니다.

c와 d 값 입력: 4 7
c 값은: 11
b 값은: 2

입력받은 두 지역 변수의 합은 c = 4 + 7 = 11이 되고, 전역 변수의 곱은 b = 1 × 2 = 2가 됩니다. 이처럼 지역 변수는 함수 내부에서만 유효하고, 전역 변수는 프로그램 전체에서 접근할 수 있다는 점을 코드를 통해 직관적으로 확인할 수 있습니다.