79 기억 부류 지정자 사용하기

C 언어의 변수는 기억 부류 지정자(storage class specifier)를 사용하여 다양한 특성을 지정할 수 있습니다.

표 79-1 기억 부류 지정자
키워드 저장 장소 범위 초깃값 수명 주기
extern 데이터 섹션(초기화)
BSS 섹션(비초기화)
프로그램 0 프로그램 시작부터 종료까지
auto 스택 블록초기화되지 않음 블록 시작부터 종료까지
static 데이터 섹션(초기화)
BSS 섹션(비초기화)
블록 또는 파일 0 프로그램 시작부터 종료까지
register CPU 레지스터 블록 초기화되지 않음 블록 시작부터 종료까지

전역 변수(extern)와 정적 변수를 선언할 때 값을 초기화했으면 데이터 섹션(.data)에 생성되고, 초기화하지 않았으면 BSS 섹션(.bss)에 생성되며 0이 들어갑니다. 이 부분은 운영체제와 컴파일러에 관련된 내용이라 완벽하게 이해하지 않아도 됩니다. 여기서는 static의 특성만 이해하면 됩니다.

이번에는 변수와 함수에 기억 부류 지정자를 사용했을 때의 특징을 자세히 알아보겠습니다.

79.1 자동 변수 사용하기

자동 변수는 변수를 선언할 때 앞에 auto 키워드를 붙입니다. 단, 전역 변수에는 auto 키워드를 붙일 수 없습니다.

  • auto 자료형 변수이름;

auto.c

#include <stdio.h>

int main()
{
    auto int num1 = 10;    //  자동 변수 num1 선언. 현재 블록이 끝나면 사라짐

    printf("%d\n", num1);

    return 0;
}

실행 결과

10

자동 변수는 현재 블록이 끝나면 사라집니다. 즉, 변수가 생성된 뒤 자동으로 사라진다고 해서 자동 변수(automatic variable)라 부릅니다. 우리가 지금까지 함수 안에 선언했던 변수는 모두 자동 변수이며 워낙 많이 사용하는 변수 형태이다 보니 auto 키워드를 생략합니다.

int main()
{
    int num1 = 10;    // auto 키워드를 생략하여 자동 변수 선언

정확하게 이야기 하자면 num1은 자동 변수이면서 지역 변수인데 main 함수 블록(범위)을 벗어나면 자동으로 사라져서 자동 변수이고 main 함수 블록(범위) 안에서만 접근할 수 있어서 지역 변수입니다. 보통 지역 변수는 자동 변수로 선언하기 때문에 자동 변수라는 말은 생략하고 그냥 지역 변수라고 말합니다.

특히 지역 변수는 전역 변수와 대응하는 말이며 자동 변수는 뒤에 설명할 정적 변수(static)와 대응하는 말입니다.

자동 변수는 선언할 때 초깃값을 지정하지 않으면 쓰레기 값이 들어갑니다. 전역 변수와는 달리 알아서 초기화해주지 않습니다.

참고로 C++의 auto 키워드는 자료형을 자동으로 추론하여 변수를 선언하는 기능이라 C 언어와는 전혀 다릅니다.