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

C 언어 변수의 수명(Lifetime)과 저장 클래스 완벽 정리

저장 클래스(Storage Class)는 변수의 범위(scope), 수명(lifetime), 그리고 연결(linkage)을 결정하는 중요한 요소입니다.

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

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

저장 클래스를 지정하면 다음과 같은 사항들을 알 수 있습니다.

  • 변수가 어디에 저장되는가? (메모리 또는 CPU 레지스터)
  • 아무것도 초기화하지 않았을 때 변수의 기본값은 무엇인가?
  • 변수의 범위(scope)는 어디까지인가? 즉, 어디에서 접근할 수 있는가?
  • 변수의 수명은 얼마나 되는가?

변수의 수명(Lifetime)

변수의 수명이란 컴퓨터가 해당 변수를 위해 메모리를 할당해 두는 기간, 즉 메모리가 할당된 시점부터 해제되는 시점까지의 기간을 의미합니다.

C 언어에서 변수는 다음 세 가지 수명 중 하나를 가질 수 있습니다.

  • 자동(Automatic) − 선언문이 실행될 때마다 변수가 새로 생성되고, 선언된 블록을 벗어나면 소멸됩니다.
  • 정적(Static) − 선언문이 처음 실행될 때 단 한 번 생성되며, 프로그램 실행이 종료될 때까지 유지됩니다.
  • 동적(Dynamic) − malloc(), free()와 같은 메모리 관리 함수를 통해 메모리가 할당되고 해제됩니다.

C 언어의 네 가지 저장 클래스

C 언어에는 다음과 같은 네 가지 저장 클래스가 있습니다.

저장 클래스저장 영역기본 초기값수명범위키워드
자동(Automatic)메모리쓰레기값(Garbage)블록 내에 제어가 머무는 동안지역(Local)auto
레지스터(Register)CPU 레지스터쓰레기값(Garbage)블록 내에 제어가 머무는 동안지역(Local)register
정적(Static)메모리0함수 호출 사이에도 값이 유지됨지역(Local)static
외부(External)메모리0프로그램 실행 전체 기간전역(Global)extern

예제 1: 자동(auto) 저장 클래스

다음은 자동 저장 클래스를 사용한 C 프로그램입니다.

#include <stdio.h>

main() {
    auto int i = 1;
    {
        auto int i = 2;
        {
            auto int i = 3;
            printf("%d ", i);
        }
        printf("%d ", i);
    }
    printf("%d", i);
}

실행 결과

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

3 2 1

가장 안쪽 블록의 변수 i(값 3)가 먼저 출력되고, 각 블록을 벗어날 때마다 바깥쪽 블록의 변수 i(값 2, 1)가 차례로 출력됩니다. 이름이 같더라도 블록마다 서로 독립적인 메모리 공간을 가진다는 점을 확인할 수 있습니다.

예제 2: 외부(extern) 저장 클래스

다음은 외부 저장 클래스를 사용한 C 프로그램입니다.

#include <stdio.h>

extern int i = 1; /* 이 'i'는 프로그램 전체에서 사용 가능 */

main() {
    int i = 3; /* 이 'i'는 main 함수 안에서만 유효 */
    printf("%d ", i);
    fun();
}

fun() {
    printf("%d", i);
}

실행 결과

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

3 1

main() 함수 안에서는 지역 변수 i(값 3)가 우선하므로 3이 출력되고, fun() 함수에는 지역 변수가 없으므로 전역 변수 i(값 1)가 출력됩니다.

정리

저장 클래스는 변수가 어디에 저장되고, 어떤 기본값을 가지며, 어디까지 접근 가능하고, 얼마나 오래 살아남는지를 결정합니다. 상황에 맞는 저장 클래스를 적절히 선택하면 메모리 사용 효율과 코드의 안정성을 모두 높일 수 있습니다.