내용 출처 : YES C (정보공학연구소 /생능출판사)
혼자 연구하는 C/C++ (SoEn.kr /와우북스)
기억 부류 (Storage Class)
명칭 |
기억지정자 |
선언위치 |
해제시기 |
기억장소 |
통용범위 |
자동 초기화 |
지역 변수 (또는 자동 변수) |
없음 (또는 auto) |
블럭 내부 |
블럭 종료시 |
스택 |
선언된 블럭 내 |
되지 않음 |
전역 변수 |
없음 |
모든 블럭 외부 |
프로그램 종료시 |
정적 영역 |
프로그램 전체 |
0으로 초기화 |
정적 변수 |
static |
함수 내부 |
프로그램 종료시 |
정적 영역 |
함수 내부 |
0으로 초기화 |
함수 외부 |
선언된 모듈 내에서만 사용가능한 전역변수화. 외부 모듈에서 extern 지정자로 참조할 수 없다. |
|||||
외부 변수 | extern | 모든 블럭 외부 | 모듈 외부에서 선언된 전역변수를 참조하고자 할 때 extern 지정자를 사용한다. | |||
레지스터 변수 |
register |
블럭 내부 |
블럭 종료시 |
CPU 레지스터 영역 |
선택된 블럭내 |
되지 않음 |
Ⅰ. 지역 변수(Local variables) = 자동 변수(Auto variables)
① 특정한 블럭 내에서 선언되어 그 블럭 내에서만 사용가능한 변수.
② auto 지정자는 생략이 가능하기 때문에 거의 쓰지 않는다. (VS2010이상의 컴파일러 기준) C++에서는 auto의 의미가 다르게 정의되어 있다.
③ 지역변수는 선언시에 스택에 생성되고 생성된 블럭이 끝나는 순간 해제된다.
④ 매번 생성될 때마다 자동으로 초기화하면 컴파일 시간이 길어질 수 있으므로 자동으로 초기화하지 않는다.
⑤ 지역변수의 경우 선언된 블럭이 서로 다르다면 이름이 중복될 수 있다.
⑥ 전역변수와 지역변수의 이름이 겹칠 경우 통용범위가 더 좁은 지역변수가 우선적으로 사용된다. 이는 지역변수끼리도 마찬가지다.
⑦ 물론 의도적으로 변수의 이름을 겹쳐서 사용하는 것은 좋지 않다.
※ 스택(stack):
First In Last Out이 되는 저장공간을 이르는 말.
예시 이미지에서와 같이 파랑색링을 빼려면 나머지를 다 빼야하는 형태의 구조를 말한다.
후에 자료구조를 다룰 때 더 자세하게 다룰 예정.
Ⅱ. 전역 변수(global variables)
① 어떤 블록에도 속해있지 않아서 어디서나 사용가능한 변수.
② extern 키워드를 사용하면 다른 모듈에서도 사용이 가능하다.
③ 프로그램이 시작될 때 정적영역에 생성되고 이후 프로그램 종료시까시 해제 및 재생성되지 않고 값이 유지된다.
④ 생성시 따로 초기화를 하지 않으면 자동으로 0으로 초기화된다.
Ⅲ. 정적 변수 (static variables)
① 선언된 블록내에서만 사용가능하나 전역변수와 같이 정적 영역에 생성되어 프로그램 종료시까지 값이 변하지 않는 변수.
② 정적 영역에 생성되므로 따로 초기화하지 않으면 자동으로 0으로 초기화된다.
③ 블록 내부에서 선언된 정적변수는 선언된 블록 내부에서만 사용가능하다는 점에서는 지역변수와 동일하고,
③ 프로그램 종료시까지 값이 변하지 않는다는 점에서는 지역변수와 동일하다.
④ 정적 변수를 블록 외부에 선언하면 다른 전역변수와 동일하나 extern 지정자로 모듈 외부에서 참조할 수는 없다.
Ⅲ. 외부 변수 (external variables)
① 다른 모듈에서 선언된 전역 변수를 사용하고자 할때 extern 지정자를 사용한다.
② 변수 선언은 프로그램 상단에서 한다는 원칙만 제대로 지키면 그 외의 경우에 extern 지정자를 사용할 일이 생기지 않는다.
Ⅳ. 레지스터 변수 (register variables)
① 지역변수와 완전히 동일하나 CPU내의 레지스터 영역내에 생성되므로 매우 빠르게 참조가 가능한 변수.
② 하지만 비쥬얼 스튜디오에서는 레지스터 지정자를 무시하고 최적화 옵션에 따라서 자동으로 레지스터 변수를 관리한다.
Ⅴ. 정적 함수 (static function)
① 모든 함수는 기본적으로 전역 변수처럼 외부에서도 참조가 가능하다.
② 그렇기때문에 서로 다른 사람이 각 모듈을 개인적으로 작성하고 합성할 경우 함수명이 중복되는 문제가 생길수도 있다.
③ 이 때 함수의 리턴타입 앞에 static 키워드를 적어주면 그 모듈내에서만 사용하는 정적 함수가 되므로 이런 문제를 예방할 수 있다.