C 언어 첫 번째 포스팅에서 변수란 어떠한 데이터 값을 담아놓는 공간이라 설명하였다.
이런 변수가 생성될 때 변수에게 메모리 공간을 지정하는 것을 기억장소 '할당' 이라고 하며, 변수의 사용이 끝난 뒤 할당되었던 메모리 공간을 다시 가용 공간으로
만드는 것을 '회수' 라고 한다.
기억 클래스에 따라 변수에게 할당되는 메모리 영역이 각자 다른데, 기억 클래스는 다음과 같이 4 가지가 있다.
기억 클래스는 변수를 선언할 때 지정할 수 있는데, 다음과 같이 데이터 타입 앞에 위치한다.
기억 클래스에 대한 구체적인 내용을 알기 위해서는 메모리에 적재되어 실행 중인 프로그램의 구조를 알아야 하는데, 이를 그림으로 나타내면 아래와 같다.
텍스트 영역 : 프로그램 코드 저장
정적 : 변수 할당 영역 (크기 지정)
스택, 힙 영역 : 변수 할당 영역 (크기 미지정)
지역 변수(=자동 변수)
이전 포스팅에서 사용된 대부분의 변수들은 지역 변수이다. 지역 변수를 선언하는 형식은 다음과 같은데 'auto'의 경우 새약해도 무방하다.
지역 변수는 함수 안에서 선언되고, 함수 안에서 사용되고, 함수의 실행이 종료되면 자동으로 메모리에서 삭제된다. 지역 변수가 할당 되는 공간은 스택 영역이다.
아래의 프로그램을 보도록 하자.
06 행 : 지역변수 a,b가 선언되면서 스택 영역에 할당된다.
08 행 : func1 함수 호출에 의해 16 행의 지역변수 x가 선언되면서 스택 영역에 할당된다.
호출이 끝나면 x는 메모리(스택 영역)에서 사라진다.
09 행 : func2 함수 호출에 의해 21 행의 지역변수 a가 선언되면서 스택 영역에 할당된다.
func2 함수 내에서의 a는 06 행의 a가 아니라 21 행의 a가 된다.
호출이 끝나면 21 행의 a는 메모리(스택 영역)에서 사라진다.
12 행 : main 함수가 끝나면서 06 행의 a,b 역시 스택에서 사라진다.
전역 변수
전역 변수는 함수의 외부에서 선언된 변수로, 변수가 선언된 위치에서 아래에 있는 한 어느 함수에서든지 사용할 수 있다. 전역 변수가 할당되는 공간은 정젹 영역이다.
아래의 프로그램을 보도록 하자.
05 행 : 전역변수 a(5), b(7)이 선언되면서 정적 영역에 할당된다.
09 행 : 지역변수 a(3.5)가 선언되면서 스택 영역에 할당된다.
11 행 : 출력하고자 하는 'a'는 09 행의 지역변수 'a'를 의미한다.
12 행 : 출력하고자 하는 'b'는 05 행의 전역변수 'b'를 의미한다.
14 행 : func 함수가 호출 되면서, 21 행의 지역변수 b(7.4)가 선언되면서 스택 영역에 할당된다.
22 행 : 출력하고자 하는 'a'는 05 행의 전역변수 'a'를 의미한다.
23 행 : 출력하고자 하는 'b'는 21 행의 지역변수 'b'를 의미한다.
정적 변수
정적 변수는 지역 변수와 같이 함수 안에서 선언되며, 정적 영역에 저장되고 그 함수 안에서만 사용할 수 있다.
그러나, 함수를 종료하면 자동으로 회수되는 지역 변수와 달리 정적 변수는 함수를 벗어나고 프로그램이 종료(main 함수 종료)될 때 까지 회수되지 않고 값이 유지된다.
정적 변수는 아래와 같이 선언한다.
정적 변수를 사용한 프로그램은 아래와 같다.
07 행 : 지역변수 'i' 가 선언되면서 스택 영역에 할당된다.
10 행 : func 함수가 호출되면서..
17 행 : 정적변수 'stVar' 가 선언되면서 정적 영역에 할당된다.
18 행 : 지역변수 'autoVar'가 선언되면서 스택 영역에 할당된다.
20 ~ 21 행 : stVar, autoVar 의 값을 1 증가시킨다.
23 행 : autoVar의 현재 값인 '1'을 출력한다.
24 행 : stVar의 현재 값인 '1'을 출력한다.
25 행 : func 함수가 끝나면서 지역 변수인 autoVar는 회수되어 값이 '0' 이 되지만, 정적 변수 stVar는 남아 있어 값이 유지된다.
09 행 : 반복문의 횟수를 증가한다.
20 행 : 이전의 stVar 값인 '1' 에 '1'을 더해서 '2' 를 만든다.
21 행 : 18 행에서 선언된 autoVar 값인'0'에 '1'을 더해서 '1'을 만든다.
09 행 :반복문 반복...
레지스터 변수
지금까지 살펴 본 모든 변수의 할당은 메모리에 할당된다. 그러나, 레지스터 변수는 메모리가 아닌 레지스터에 할당된다. 레지스터는 CPU내에 있는 기억 공간으로
일시적으로 정보를 저장하는데, 메모리에 비하여 빠른 접근 속도를 가진다. 그러나, 레지스터의 개수는 제한적이기 때문에 레지스터 변수 또한 제한적일 수 밖에 없어서
빠른 접근 속도가 필요하고, 자주 사용되는 변수로 사용하기에 적합하다. 또한 레지스터는 주소 개념이 없기 때문에 포인터 변수를 이용하여 가리킬 수 없다.
레지스터 변수를 선언하는 방법은 다음과 같다.
레지스터 변수와 일반 변수가 할당되는 공간의 차이점을 그림으로 나타내면 아래와 같다.