About C – “지역 변수, 전역 변수, 기억 클래스”

About C – “지역 변수, 전역 변수, 기억 클래스”

10월 1, 2021

지역 변수, 전역 변수

  • 지역 변수란, 해당 함수나 블록 내에서 사용할 수 있는 변수입니다.
  • 전역 변수란, 소스 전체에서 사용할 수 있는 변수입니다.
  • 함수나 블록 안에서 변수를 선언하면 지역 변수가 됩니다.
  • 함수 밖에서 선언하면 전역 변수가 됩니다.
#include <stdio.h>
int main(void)
{
    int a = 5;
    printf("블록 밖의 a=%d\n",a);
    {
        int a = 100;
        a = a + 100;
        printf("블록 안의 a=%d\n",a);
    }
    a = a + 5; // 과연?
    printf("블록 밖의, 연산 후의 a=%d\n",a);
    return 0;
}
/* 블록 밖의 a=5
블록 안의 a=200
블록 밖의, 연산 후의 a=10 */

코드를 실행해 보면, 블록 안의 a와 밖의 a가 구별되는 것을 알 수 있습니다. 블럭 밖의 a는 전역 변수이고, 블럭 안에 있는 a는 지역 변수입니다.

자료형, 기억 클래스

  • 변수 선언시에 이용하는 예약어와 선언된 위치에 따라 기억 클래스가 결정됩니다.
  • 변수의 값이 어떤 종류의 메모리에 저장되는지를 결정합니다.
  • 자료형은 자료의 크기를, 기억 클래스는 자료의 기억 위치를 결정하는 것입니다.

기억 클래스 – auto(자동)

  • auto 기억 클래스는 가장 많이 사용하는 기억 클래스입니다.
  • 기억 클래스가 명시되지 않고 선언된 변수는 모두 자동 변수입니다.
  • 함수 또는 블록의 내부에서 선언합니다.
  • stack 공간을 일시적으로 사용합니다.
  • 함수나 블록을 진입하면 기억 영역이 확보되고, 벗어나면 바로 소거됩니다.
  • 단, return 문으로 리턴된 값은 스택에 복사되어 외부로 전달됩니다.
  • 초기화는 실행시 이루어지며, 초기화하지 않으면 – 임의의 값을 가집니다.

아래의 예제를 살펴봅시다.

#include <stdio.h>

int main()
{ //main 함수 블록 시작
	auto int a = 1;
	{ // 첫 번째 블록 시작
		int a = 2; 
		{ // 두 번째 블록 시작
			int a = 3;
			printf("%d\n",a);
		} // 두 번째 블록 끝
		printf("%d\n",a);
	} // 첫 번째 블록 끝
	printf("%d\n",a);
	return 0;
} // main 함수 블록 끝

일단, 세 개의 printf함수가 있고 모두 a를 출력하도록 되어 있습니다. auto 기억 클래스는 블록을 벗어나면 바로 소거됩니다. 결과는 3 -> 2 -> 1 이 되겠지요.

기억 클래스 – register(레지스터)

  • 레지스터란 CPU가 연산 시에 데이터를 임시로 저장하는 데 사용되는 작고 빠른 기억 장소입니다.
  • 변수를 선언할 때 자료형 앞에 register로 선언하면 됩니다.
  • 4바이트의 데이터만 저장이 가능합니다.
  • 두 개까지만 선언할 수 있고, 초과된 변수는 auto로 저장됩니다.
  • 레지스터에는 주소가 없으므로 주소 참조가 불가능합니다.
  • 컴파일러가 최적화 과정에서 적절한 변수를 레지스터 변수로 만들기 때문에, 일부러 지정할 필요는 없습니다.

기억 클래스 – static(정적)

  • static int a; 처럼 자료형 앞에 static을 쓰면 선언할 수 있습니다.
  • 프로그램이 종료될 때까지 값을 유지합니다.
  • 처음 실행 시, 한 번만 초기화되고 초기화 값이 없으면 0으로 초기화됩니다.
  • 스택이 아닌 정적 데이터 영역을 사용합니다.
  • 지역 static변수는 해당 블록 내에서만 접근이 가능합니다.
  • 보통 전역 변수 – 소스 전체에서 사용할 수 있는 변수는 기본적으로 static이 되므로, 굳이 static 키워드를 사용하지 않아도 됩니다.

기억 클래스 – extern

  • 전역 변수는 함수 외부에 선언되는 변수이며 ,프로그램의 모든 부분에서 사용할 수 있습니다.
  • 전역 변수는 자료형 앞에 extern을 붙임으로서 사용할 수 있습니다.
  • extern int a; 처럼 선언된 extern변수는 해당 파일에서 실제로 있는 변수가 아니라 프로그램의 다른 파일에 선언된 변수인데도, 해당 파일에 사용할 수 있도록 합니다.

제가 이해한 C언어의 기억 클래스 정리입니다.

Leave A Comment

Avada Programmer

Hello! We are a group of skilled developers and programmers.

Hello! We are a group of skilled developers and programmers.

We have experience in working with different platforms, systems, and devices to create products that are compatible and accessible.