CS Interview

Storage Classes, 기억 영역 분류 (변수 선언)

게임이 더 좋아 2021. 9. 1. 21:15
반응형
728x170

 

뭐 대단한 것은 아니다.

기억 영역 분류라하면 정말 어색한데..? 

쉽게 말하면 해당 선언이 프로그램 실행 중에서 얼만큼 지속되는지를 아는 것이다.

 

예를 들면 static은 프로그램 시작부터.. 종료까지 유지된다 느낌이다.

알아보자

 


 

자동 기억 영역, Auto Storage Class

 

기본 기억 영역으로 자동변수라고 말을 한다. 

'auto' 키워드를 사용하며 선언이 가능하다.

**실제로 사용하는 경우는 거의 없다고 보면 된다.

그냥 선언하면 auto 로 선언한 것과 마찬가지니까.

 

자동변수들은 함수가 호출될 때 자동으로 생성되고 함수가 종료될 때 제거된다.

지역변수 특성을 갖는 것이다. 

 

그렇다면 main 함수의 지역변수들은 뭘까?

main 함수 내에세만 사용되더라도 프로그램 전체 실행시간 동안 살아있다.

main 함수가 프로그램의 실행동안 실행되기 때문이다.

 

선언된 블록 내에서만 의미를 가지고 초기화를 하지 않으면 junk, trash 값을 가지게 된다.

즉, 초기화 안해서 답이 잘못나오는 경우가 있으니 주의해야 한다.

 

 


 

다음은 외부 기억 영역이다.

 

이름값하는 영역인데 함수 외부에서 선언되는 녀석들이다.

이러한 변수들은 프로그램 전체 주기동안 살아있다.

다시 말하면 선언 시점부터 프로그램 종료까지 사용할 수 있다.

전역 변수처럼 기본값을 '0'이다.

 

지역변수와 다르게 프로그램 내의 모든 함수에서 접근이 가능하다.

**지역 변수오 전역 변수의 이름이 동일할 경우 전역변수 우선순위 적용이다.

 

또한 종종 extern 키워드를 사용해서 선언하는 경우가 있다.

 

즉, Global variable 같은 경우가 해당되는데

전역 변수는 모든 함수가 사용이 가능하고 변경이 되면 해당 변경된 값을 다른 함수가 참조하게 된다.

 

extern은 전역변수가 외부에 있다는 것을 알려주는 것이지

전역 변수자체를 선언하는 것이 아니다.

즉, 변수를 위한 저장공간을 할당하지 않으므로 초기화된 값을 찾으려고 한다.

 

int main(){
	extern int i;
    printf("%d", i);
    return 0;
}

int i = 2; // 이 초기화된 값을 이용

 

 


 

다음은 레지스터 영역이다, Register Storage Class

 

 

변수들이 직접적으로 레지스터에 저장되는 것이다.

역시 "register" 키워드를 사용한다.

메모리 접근 속도보다 레지스터 접근이 빠르기에 사용되지만

전역 변수를 레지스터 변수로 선언한다면 해당 레지스터는 프로그램 내내 점유될 것이기에 주의해야 한다.

 

 


Static Storage Class, 정적 기억 영역이다.

 

정적 변수들의 값은 프로그램이 종료될 때까지 지속된다.

역시나 "static" 키워드를 이용한다.

 

하지만 이 정적 변수 역시도 외부, 내부로 나누게 된다.

그래도 어차피 파일이 컴파일될 때 초기화되는 것은 마찬가지다.

 

만약 함수 내에서 정적으로 선언되면 내부 정적 변수라고 하며

선언된 곳부터 프로그램이 끝날 때까지 유지된다.

일반적으로 내부에서 쓰는 경우는 함수의 호출횟수를 저장할 때 쓴다.

 

int main(){
	for(int i = 1; i<=3; i++)
    	start();
}

void start(){
	static int x=0;
	x = x+1;
	printf("x=%d", x);
}

 

1,2,3 이 순차적으로 출력될 것이다.

 

 

만약 외부에서 정적으로 선언했다면

모든 함수들이 사용할 수 있는 정적 변수인 것은 extern 과 비슷해보이지만

정적변수는 선언된 파일 내에서만 사용할 수 있고

외부 변수는 서로 다른 모듈에서도 사용할 수 있다.

이것이 큰 차이이다.

 

또한 정적 변수말고도 정적 함수를 쓰기도 하는데

정적 함수는 선언된 파일 내에서만 접근이 가능하고 다른 모듈에서 접근을 막을 때 쓴다.

 

 

 

728x90
반응형
그리드형