-
스토리지 클래스
[학습내용] [학습목표] ▪ 기초 이해
▪ 정적 변수▪ 스토리지 클래스의 종류에 대해 설명할 수 있다.
▪ 정적 변수의 특징에 대해 설명할 수 있다.기초 이해
1. 기억부류(스토리지 클래스)
▪ 변수나 함수의 저장 위치와 사용 범위를 결정
▪ 변수나 함수 선언 시 맨 앞에 지정
▪ 변수의 디폴트 기억 부류는 auto이고, 함수의 디폴트 기억 부류는 extern
2. auto 변수
▪ 지역변수는 디폴트로 auto 기억 부류를 사용
➡ auto 지역 변수는 선언된 위치에서 자동으로 생성되고, 선언된 블록을 빠져나갈 때 자동으로 해제됨
▪ 전역 변수에는 auto 지정 불가
int main(void){ auto int x = 10; //auto 변수를 선언함 int y = 20; //auto를 생략해도 y는 auto 변수임 }
▪ for 루프에서 선언 시 루프 내에서만 통용
for(int i=0 ; i < 5 ; i++) printf("%d", i );
3. register 변수
▪ 변수를 메모리에 할당하는 대신 CPU의 레지스터에 할당
▪ 변수를 레지스터에 할당하면 변수에 좀 더 빠르게 접근
▪ 보통 루프 제어 변수를 레지스터 변수로 선언
register int i ; //레지스터 변수를 선언함 for ( i = 0 ; i < 10000 ; i ++ ) sum + = i ;
▪ register 변수로 선언해도 변수가 레지스터에 할당되지 않을 수 있음
▪ 레지스터 변수에 대해서는 주소 구하기 연산자를 사용할 수 없음
register int i; printf( “%p”, &i ) ; //레지스터 변수의 주소는 구할 수 없으므로 컴파일 에러
4. global 변수
▪ 다른 곳에 선언된 변수에 대하여 별도의 메모리 할당 없이 해당 변수를 사용
▪ 전역 변수를 코드 중간에 선언하면, 전역 변수가 선언된 뒤 쪽에 정의된 함수에서만 전역변수를 사용 가능
*** 전역 변수의 선언 위치 *** void TestGlobal(void){ global = 10; //아직 선언되기 전이므로 컴파일 에러가 발생함 } int global = 0; int main(void){ global = 20; //전역 변수를 선언한 이후에 사용할 수 있음 }
전방 선언(Forward Declaration 전역 변수에 대한 extern 선언이 있으면 전역 변수가 선언된 위치와 관계없이 전역 변수 사용 가능 *** 전역 변수의 전방 선언 *** extern int global; //메모리는 할당하지 않고 사용 범위만 늘려줌 void TestGlobal(void){ global = 10; //전역 변수를 사용할 수 있음 } int global = 0 int main(void){ global = 20; //전역 변수를 사용할 수 있음 }
정적 변수
1. 배열 포인터 개요
키워드 : static
▪ 번역 과정의 마지막 단계인 적재 시간에 기억장소를 할당 받는 변수
▪ 전체 프로그램의 시작부터 종료까지를 생존 기간으로 하며 동일 기억 장소를 유지
▪ 초기화는 기억 공간 할당 시 한 번만 초기화 됨
▪ 정적 지역 변수는 전역 변수처럼 프로그램이 시작할 때 메모리에 할당되고 프로그램이 종료할 때 해제
▪ 전역 변수와는 달리 정적 지역 변수는 선언된 함수 안에서만 사용
▪ 정적 지역 변수는 함수가 리턴하더라도 해제되지 않고 남아있다가 그 다음 함수 호출 시 그대로 다시 이용
#include <stdio.h > void func() { static int x = 0; int y=0; x++; y++; printf("%d %d\n”, x, y); } int main() { func(); func(); func(); return 0; }
char* Reverse(const char *str){ //주소(char*)를 리턴하는 함수 char result[80]; //result 배열을 지역 변수로 선언함 int i; int len = strlen(str); for( i = 0 ; i < len ; i ++ ) result[i] = str[len – i – 1]; result[i] = ‘\0’; return result ; //result 배열명이므로 지역 변수인 배열의 주소를 리턴함 }
포인터를 리턴하는 함수를 정의할 때는 함수 안에 선언된 지역 변수의 주소를 리턴하지 않도록 주의해야 함
char* Reverse(const char *str){ static char result[80]; //result 배열을 정적 지역 변수로 선언함 int i; int len = strlen(str); for( i = 0 ; i < len ; i ++ ) result[i] = str[len – i – 1]; result[i] = ‘\0’; return result ; //정적 지역 변수의 주소를 리턴함 }
result를 정적 지역 변수로 선언하면 함수가 리턴하더라도 해제되지 않으므로 올바른 실행 결과를 얻을 수 있음
2. 정적 전역 변수
▪ 정적 전역 변수는 정적 전역 변수가 선언된 소스 파일에서만 사용
▪ 정적 전역 변수는 전역 변수를 다른 소스 파일에서 접근하지 못하도록 제한
3. 스토리지 클래스 비교
구분 일반 지역 변수 정적 지역 변수 전역 변수 정적 전역 변수 선언 위치 함수 안 함수 안 함수 밖 함수 밖 생성 시점 변수 선언 시 프로그램 시작 시 프로그램 시작 시 프로그램 시작 시 해제 시점 함수 리턴 시 프로그램 종료 시 프로그램 종료 시 프로그램 종료 시 사용 범위 함수 안 함수 안 프로그램 전체 선언된 소스 파일 초기화하지 않았을 때 쓰레기 값 0으로 초기화 0으로 초기화 0으로 초기화
학습정리
1. 기초 이해
▪ 지역 변수는 자동 변수임
▪ 자동 변수는 선언된 블록을 빠져나가면 소멸됨
▪ 레지스터 변수는 CPU의 레지스터에 할당되는 메모리도 빠른 액세스가 가능함
▪ 전역 변수는 프로그램 전체에서 통용되고 다른 파일에서도 통용 가능함
2. 정적 변수
▪ 정적 지역 변수는 할당 시 한 번만 초기화되고 선언된 블럭을 빠져나가도 소멸되지 않음
▪ 정적 전역 변수는 프로그램 전체에서 사용 가능함
▪ 정적 변수는 할당 시 0으로 초기화됨
'Blog > JAVA기반 스마트웹 개발2021' 카테고리의 다른 글
프로그래밍 언어 활용 part 1 - 전처리기 (0) 2021.08.01 프로그래밍 언어 활용 part 1 - 배열 포인터 처리 (0) 2021.08.01 프로그래밍 언어 활용 part 1 - 함수의 인자 (0) 2021.08.01 프로그래밍 언어 활용 part 1 - 공용체와 열거체 (0) 2021.07.31 프로그래밍 언어 활용 part 1 - 구조체 (0) 2021.07.31 댓글