Skip to main content
C Storage Class

C언어 저장 클래스 (Storage Class)

C언어는 변수를 선언할 때 저장 클래스(Storage Class)를 같이 지정할 수 있습니다. 다른 언어의 Class와는 아주 다른 의미이며 다음 세 가지 속성을 정의하고 있습니다.

  • 범위 (Scope) –  프로그램내에서 접근 가능한 범위를 정합니다.
  • 기본 초기값 (Default initial value) – 변수의 기본 초기값을 정합니다.
  • 수명 (Lifetime) – 변수의 수명을 정합니다.

저장 클래스(Storage Class)는 다음과 같습니다.

  1. Automatic
  2. External(Global)
  3. Static
  4. Register

1. Automatic

  • 범위(Scope): 함수내에서만 엑세스 가능합니다.
  • 기본 초기값 (Default initial value): 아무 의미 없는 값(Garbage value)으로 초기화됩니다.
  • 수명 (Lifetime): 함수가 종료되면 같이 소멸합니다.
#include<stdio.h>
    
void main()
{
    int detail;
    // 또는 
    auto int details;    //auto 생략 가능
}

함수 내부에 선언된 변수이며 auto 키워드는 생략 가능합니다. 즉, 함수 내 모든 변수는 auto 속성이 있습니다. auto 변수는 함수 내에서만 사용할 수 있고 함수가 끝나면 수명도 끝납니다. 이러한 변수들을 로컬(Local) 변수라 하고 초깃값을 선언하지 않으면 아무 의미 없는 값(Garbage value)으로 초기화됩니다.

2. External(Global)

  • 범위(Scope): 프로그램 내 어디서든 접근 가능합니다.
  • 기본 초기값 (Default initial value): 0 (zero)
  • 수명 (Lifetime): 프로그램이 종료하면 소멸합니다.
#include<stdio.h>

int number;     // global 변수

void main()
{
    number = 10;
    printf("메인 변수내 변수값 %d\n", number);
    fun1();     //함수 호출
    fun2();     //함수 호출
}

/* 함수 func1 */
fun1()
{
    number = 20;
    printf("func1 함수내 변수값 is %d", number);
}
/* 함수 func2 */
fun2()
{
    printf("\nfunc2 함수내 변수값 My value is %d", number);
}

OUTPUT
메인 변수내 변수값 10
func1 함수내 변수값 20
func2 함수내 변수값 20

함수 외부에서 선언된 변수이고 글로벌(Global) 변수라고 합니다. 프로그램이 종료할 때까지 존재하며 기본 초깃값은 0(zero) 입니다. 중요한 점은 변숫값은 프로그램 내 어느 함수에서 접근 가능하고 변경 가능합니다.

위 예제에서 number는 글로벌 변수이지만 main, func1 그리고 func2 모든 함수에서 접근 가능하고 변경 가능합니다.

하지만 문제는 변수가 프로그램이 종료할 때까지 존재하므로 너무 많은 글로벌 변수의 사용은 메모리의 낭비를 초래합니다.

extern 키워드

extern 키워드는 다른 파일에서 선언 및 정의된 변수를 접근할 때 사용합니다 그러므로 extern 키워드로 선언된 변수는 저장 공간을 할당하지 않습니다.

다음의 예제는 같은 변수명에 하나는 extern 키워드가 하나는 글로벌 변수로 선언된 경우입니다. 비록 변수명이 같지만 두 개는 아주 다른 타입의 변수입니다.

int main()
{
    extern int x;   // 여기서 x는 다른 파일에서 정의된 Global 변수
    x = 10;      
    printf("%d", x);    
}
int x;      // Global 변수 x

3. Static

  • 범위(Scope): 변수가 선언된 위치에 따라 함수 내 혹은 프로그램 전체에서 접근 가능합니다.
  • 기본 초기값 (Default initial value): 0 (zero)
  • 수명 (Lifetime): 프로그램이 종료하면 소멸됩니다.
#include<stdio.h>

void test();    //함수 선언
 
int main()
{
    test();
    test();
    test();
}

void test()
{
    static int a = 0;    //static 변수
    a = a + 1;
    printf("%d\t",a);
}

OUTPUT
1 2 3

static 변수는 딱 한 번 초기화된 후에 프로그램이 종료할 때까지 값(value)이 지속됩니다. 또한, 변수의 선언 위치에 따라 접근 가능한 범위가 달라집니다. 함수 내에서 선언되면 함수 내에서만 접근할 수 있고 함수 외부에서 선언되면 글로벌 변수와 같이 프로그램 어디에서든 접근이 가능합니다.

4. Register

  • 범위(Scope): 변수가 선언된 함수 내에서 접근 가능합니다.
  • 기본 초기값 (Default initial value): 의미없는 값 (Garbage value)
  • 수명 (Lifetime): 함수가 종료되면 소멸됩니다.
register int number;

register 저장 클래스와 같이 선언된 변수는 값이 메모리에 저장되는 것이 아닌 CPU 레지스터(register)에 저장됩니다. 그러므로 일반 변수와는 다르게 빠른 접근이 가능합니다. 일반적으로 register와 함께 사용 안 해도 자주 사용되는 변수들은 컴파일러가 알아서 레지스터에 저장하고 사용합니다.

예로 루프(Loop) 안에 사용되는 짧고 반복적으로 사용되는 변수들은 register에 등록하여 사용하면 빠른 처리 결과를 얻을 수 있습니다.

register에 등록된 변수의 주소 값은 절대 구할 수가 없습니다. 따라서 참조 연산자(&)로 주소 값을 구할 수 없습니다.

중요한 점은 CPU에 할당된 레지스터의 개수의 제한으로 register를 사용한다고 해도 모두 레지스터를 사용한다고 장담하지 못합니다. 만약 레지스터에 등록되지 못하면 해당 변수는 auto로 사용됩니다. 

저장 클래스의 사용방법

프로그램의 실행 속도를 높이고 변수가 사용하는 메모리 공간을 적절히 사용하려면 다음 항목들을 명심하며 사용해야 합니다.

  1. 만약 프로그램 실행 시 변수의 값을 지속하고 관리해야 할 때 static을 사용합니다.
  2. 만약 프로그램에서 자주 사용되는 변수는 register를 사용합니다. 하지만 CPU의 레지스터는 제한적이므로 신중하게 사용해야 합니다.
  3. 만약 동일 변수가 프로그램의 거의 모든 함수에서 사용될 때 글로벌(Global) 변수를 사용해야 합니다.
  4. 만약 위에 언급한 사용 목적이 아니라면 auto를 사용해야 합니다.
<< 다음 혼자 공부하는 C언어 이전 >>

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다