C언어 Storage Class (기억부류, Scope)

Minimal_user·2024년 5월 9일

c언어

목록 보기
7/17
기억 부류전역지역정적레지스터
지정자externautostaticregister
저장 장소정적 데이터 영역스택정적 데이터 영역CPU의 레지스터
선언 위치함수의 외부함수의 내부함수의 내부함수의 내부
통용 범위프로그램 전체함수의 내부함수의 내부함수의 내부
파괴 시기프로그램 종료시함수의 종료시프로그램 종료시함수 종료시
초기값0으로 초기화초기화되지 않음0으로 초기화초기화되지 않음

1. 지역변수 와 외부변수

# include <...>
void func();

int global; // 함수 외부에서 선언된 전역변수

void main(){
	int local; // main 함수의 지역변수
    
    golobal = 1; // 가능
    local = 2; // 가능
    i=3; // 불가능
}

void func(){
	int i; // func 함수의 지역변수
    
    golobal = 1; // 가능
    local = 2; // 불가능
    i=3; // 불가능
}

  • 변수가 생성되는 기억 장소가 다르다.

    • 전역변수는 한 번 정해진 메모리 위치에 계속 남아 있어야 하므로 정적 데이터 영역에 생성된다.
    • 정적 데이터 영역이란 프로그램의 코드 바로 다음에 위치하는 실행 파일의 한 부분인데 프로그램이 실행될 때 메모리로 로드되어 실행 중에 계속 유지된다.

  • 지역변수 사용의 장점

    • 함수의 독립성을 높인다.
    • 디버깅 효율을 향상시킨다.
    • 메모리를 절약한다.
    • 재귀 호출이나 상호 호출 같은 특별한 기법은 지역변수가 있어야만 사용할 수 있다.

  • extern 키워드는 변수가 외부 어딘가에 선언되어 있다는 것을 알리는 역할을 한다.

    • 아래의 첫 번째 예시의 경우 함수가 외부 변수를 이용하지만 이 외부 변수가 이 함수 정의된 이후에 선언되어 있다면 반드시 extern 키워드를 선언해야 한다.
    • 두 번째 예시의 경우 전역변수가 다른 외부 모듈에 선언되어 있을 때다.
    • 무엇보다 extern 선언은 이 선언이 있는 블록 내에만 외부변수의 존재를 알리는 특징이 있다.
      • 따라서 해당 소스 파일 내에 있는 모든 함수가 외부 모듈에 있는 외부 변수를 참조하기 위해서
        소스의 가장 상위 위치에 선언해야 한다.
#include <...>

int before = 11;

void main(){
	extern int after;
    printf("%d %d\n", before, after);
}

int after = 22;

// -------global.c---------
int value=1234;

// -------main.c-----------
# include <...>

void main(){
	extern int value;
	printf("%d\n", value);
}

2. 정적변수

  • 정적변수 (Static variable)은 전역변수와 지역변수의 성격을 동시에 가진다.
  • 정적 변수는 저장 장소는 전역변수이되 통용 범위는 지역변수라고 할 수 있다.
  • 정적변수를 선언할 대는 반드시 static이라는 지정자를 붙여야 한다.
  • 정적변수는 주로 함수 내부에서 선언(내부 정적변수)하며, 함수가 최초로 실행될 때 초기화된다.
    • 함수 외부에서도 선언이 가능한데 외부 변수와 비슷해 보이지만 다른 모듈에 공유할 수 없다.
void PrintCount();

void main(){
	for (int i=0;i<5;i++){
    	PrintCount();
    }
}

void PrintCount(){
	static itn count = 0;
    count++;
    printf("%d\n", count);
}
  • 정적 함수라는 것도 있다.
    • 이 경우 이 함수는 정적변수와 마찬가지로 외부 모듈에 공유할 수 없다.
    • 이를 이용하여 다른 모듈의 동일한 이름을 가지는 함수의 충돌을 (어느 정도) 피할 수 있다.
      • 외부로 공유하지 않을 함수가 되므로 해당 c파일에 대한 헤더파일에 함수의 원형을 기재할 필요는 없지만,
        따라서 해당 c파일의 상단에 함수의 원형을 기재해야 한다.

3. 통용범위

  • 통용 범위가 겹쳐 있을 경우 좁은 범위를 가지는 명칭에게 우선권이 부여된다.
  • 범위의 단위는 '블록'이다.
    • 참고로 c언어에서는 { }만 이용해서 강제로 블록을 만들 수 있다.
    • 컴파일러마다 다르지만 for문의 초기식에서 정의한 변수와 for문이 위치한 곳에 정의된 변수는 블록이 다르다.

출처 : 혼자 연구하는 C/C++ 1 / 김상형 저 / 와우북스

profile
White book for everything I need.

0개의 댓글