C 언어 기억 클래스(Storage Class)

  • 11 minutes to read

C 언어 기억 클래스는 변수가 메모리상에서 어떻게 할당되고, 관리되어야 하는지를 지시하는 키워드를 의미합니다. 변수의 성격과 사용 방법에 따라 해당 변수가 메모리의 어떤 부분에 할당되는지 결정합니다.

C 언어에서는 총 4개의 기억 클래스가 있습니다.

  1. 자동 변수 (auto variables)
  2. 정적 변수 (static variables)
  3. 레지스터 변수 (register variables)
  4. 외부 변수 (external variables)

자동 변수와 정적 변수는 메모리상에서 저장되는 위치에서 차이가 있으며, 레지스터 변수는 레지스터에 저장됩니다. 외부 변수는 다른 소스 파일에서 선언된 변수로, 프로그램 전체에서 공유됩니다.

기억 클래스는 프로그래머가 변수에 적절한 기억 클래스를 지정하여 메모리 사용을 효율적으로 관리할 수 있도록 도와줍니다.

레지스터 변수

C 언어에서 레지스터 변수는 CPU 레지스터에 저장되는 지역 변수로, CPU의 레지스터를 이용하여 처리 속도를 향상시키는 기능을 가지고 있습니다.

레지스터 변수는 선언할 때 변수명 앞에 register 키워드를 붙입니다. CPU 레지스터는 매우 제한적이기 때문에, 프로그래머는 어떤 변수를 레지스터 변수로 사용할지 선택할 수 없습니다. 대개 자주 사용되는 변수를 레지스터 변수로 선언하면 속도가 빨라지지만, 일반적으로 C 컴파일러가 알아서 최적화를 하기 때문에 레지스터 변수로 선언하지 않아도 최적화가 이루어집니다.

레지스터 변수는 주로 반복문이나 인덱스와 같은 작은 범위의 변수에 사용되며, 주로 지역 변수로 사용됩니다. 함수의 매개 변수나 전역 변수는 레지스터 변수로 선언될 수 없습니다. 또한 레지스터 변수는 포인터 변수가 될 수 없습니다.

register 키워드를 사용한 예제

C 언어에서는 변수에 대해 기억 클래스를 지정할 수 있습니다. 이 중에서 레지스터 변수(register variable)는 프로세서의 레지스터를 이용하는 변수입니다. 이를 이용하면 레지스터를 이용해 데이터를 처리하므로 프로그램의 속도가 향상될 수 있습니다. 이번 예제에서는 레지스터 변수를 선언하고, 이를 이용해 1부터 10까지의 합을 구해 출력하는 예제입니다.

코드: register.c

#include <stdio.h>

int main(void)
{
    register int x, s = 0;  // 레지스터 변수를 선언

    for (x = 1; x <= 10; x++)
    {
        s += x;  // 레지스터 변수를 이용해 합을 계산
    }

    printf("1~10까지 합 : %d\n", s);  // 계산된 합을 출력

    return 0;
}

변수를 레지스터 변수로 선언하면, 이 변수는 프로세서의 레지스터를 사용하게 됩니다. 따라서 이를 이용하면 프로그램의 속도가 빨라질 수 있습니다. 다만 레지스터 변수는 매우 제한적으로 사용되며, CPU가 레지스터를 할당할지 여부는 컴파일러에 의해 결정됩니다.

위 예제에서는 for문을 이용해 1부터 10까지의 합을 구하고 있습니다. 이 때 x와 s를 레지스터 변수로 선언해줌으로써 프로세서의 레지스터를 사용하도록 지정하였습니다. 그리고 for문을 이용해 1부터 10까지 반복하면서, 레지스터 변수 s에 1부터 10까지의 값을 더해주었습니다. 이렇게 계산된 합을 printf를 이용해 출력하였습니다.

레지스터 변수를 사용하면 프로그램의 성능을 향상시킬 수 있지만, 레지스터 변수의 사용은 제한적이며, 메모리 크기가 작은 경우에는 레지스터 변수로 사용되지 않을 수도 있습니다. 따라서 프로그래머는 레지스터 변수를 지정하는 것이 좋은지, 변수의 크기가 어느 정도 되는 경우에 레지스터 변수를 사용해야 하는지 등을 고려해야 합니다.

C 언어 외부(extern) 변수

C 언어에서 외부 변수(external variable)란 여러 개의 소스 파일이 존재할 때, 각 소스 파일이 가지고 있는 변수 중에서 다른 소스 파일에서도 접근 가능한 변수를 의미합니다.

C 언어에서는 다른 소스 파일에서 선언한 변수를 다른 소스 파일에서 사용하기 위해 extern 키워드를 사용합니다. extern 키워드로 변수를 선언하면 해당 변수는 외부 변수로 선언되며, 다른 소스 파일에서도 해당 변수를 사용할 수 있게 됩니다.

외부 변수는 전역 변수(global variable)와 지역 정적 변수(local static variable)로 나눌 수 있습니다. 전역 변수는 함수 밖에서 선언된 변수이며, 프로그램이 시작될 때부터 종료될 때까지 메모리에 상주하며, 모든 함수에서 접근 가능합니다. 지역 정적 변수는 함수 안에서 static으로 선언된 변수로서, 해당 함수가 호출될 때 생성되어 프로그램이 종료될 때까지 메모리에 상주하며, 함수 안에서만 접근 가능합니다.

외부 변수는 여러 개의 소스 파일에서 공유할 수 있는 변수이기 때문에, 프로그램이 커질수록 프로그램의 구조와 관리가 어려워지는 단점이 있습니다. 따라서 외부 변수의 사용은 가능한 지양해야 합니다.

다음은 C 언어에서 외부 변수를 사용하는 간단한 데모 예제입니다.

코드: external_variable.c

#include <stdio.h>

int count = 0; // 전역 변수(외부 변수) 선언

void increment() 
{
    extern int count; // 전역 변수 사용
    count++; // 전역 변수 값 증가
}

int main(void) 
{
    printf("count = %d\n", count); // 초기값 출력
    increment(); // 함수 호출
    printf("count = %d\n", count); // 변경된 값 출력

    return 0;
}
count = 0
count = 1

위 예제에서 count는 전역 변수(외부 변수)로 선언되어 있습니다. increment() 함수는 count 값을 증가시키는 기능을 가지고 있습니다. main() 함수에서는 count 초기값과 increment() 함수 호출 후의 count 값을 출력하고 있습니다.

increment() 함수에서 extern 키워드를 사용하여 전역 변수 count를 참조하고 있습니다. 이를 통해 외부 변수에 접근할 수 있습니다. 만약 extern 키워드를 사용하지 않았다면, increment() 함수 내에서 새로운 지역 변수를 생성하게 됩니다. 따라서 전역 변수 값이 변하지 않게 됩니다.

여러 파일에서 extern 변수 사용하기

C 언어에서는 extern 키워드를 사용해 외부 파일에서 선언된 변수를 다른 파일에서 사용할 수 있습니다. 이를 통해 모듈성과 재사용성을 높이는 것이 가능합니다.

다음은 서로 다른 두 파일에서 extern 변수를 사용하는 예제입니다.

먼저, 기억클래스_외부변수.c 파일에서 x, y 라는 변수를 전역 변수로 선언하고, sb1(), sb2() 함수에서 이 변수를 사용하고 있습니다.

코드: 기억클래스_외부변수.c

/*
	9.1.4. 예제. 외부 변수(Extern) 사용 : 기억클래스_외부변수.c
*/
#include <stdio.h>

int x, y;

sb1()
{
	printf("서브 1 : x = %d\n", x++);
}

sb2()
{
	printf("서브 2 : x = %d\n", y++);
}

main()
{
	x = 10;
	y = 20;
	sb1();
	sb2();
	sb3();
	sb4();
}

다음으로, 기억클래스_외부변수2.c 파일에서는 sb3(), sb4() 함수를 선언하고 있습니다. sb3() 함수에서는 extern 키워드를 사용하여 x, y 변수를 외부 변수로 선언하고 있습니다. 그리고 sb4() 함수에서는 x, y 변수를 새로 선언하고 있습니다.

코드: 기억클래스_외부변수2.c

sb3()
{
	extern int x, y;	//기억클래스_외부변수.c의 변수 사용
	printf("서브 3 : x = %d, y = %d\n", x, y);
}

sb4()
{
	int x = 100, y = 200;
	printf("서브 4 : x = %d, y = %d\n", x, y);
}

이제 이 두 파일을 컴파일하면 sb3() 함수에서는 외부 변수를 참조하여 값을 출력하고, sb4() 함수에서는 새로 선언된 지역 변수를 참조하여 값을 출력합니다.

서브 1 : x = 10
서브 2 : x = 20
서브 3 : x = 11, y = 21
서브 4 : x = 100, y = 200

위 예제를 통해 extern 키워드를 이용하여 여러 파일에서 변수를 공유할 수 있음을 알 수 있습니다.

VisualAcademy Docs의 모든 콘텐츠, 이미지, 동영상의 저작권은 박용준에게 있습니다. 저작권법에 의해 보호를 받는 저작물이므로 무단 전재와 복제를 금합니다. 사이트의 콘텐츠를 복제하여 블로그, 웹사이트 등에 게시할 수 없습니다. 단, 링크와 SNS 공유, Youtube 동영상 공유는 허용합니다. www.VisualAcademy.com
박용준 강사의 모든 동영상 강의는 데브렉에서 독점으로 제공됩니다. www.devlec.com