C언어 - 기억 클래스
변수가 갖는 속성에는 자료형 (int, float, char)과 기억클래스가 있습니다.
기억 클래스란 기억되는 장소와 프로그램에서 변수의 유효 범위 즉, 선언된 변수가 영향을 미치는 범위를 결정하는 중요한 요소입니다.
C언어에서는 4가지의 기억 클래스가 있습니다.
- 자동변수
- 외부변수
- 정적변수
- 레지스터 변수
(automatic, external, static, register variables)
이 넷은 변수 선언에 사용된 예약어와 선언된 위치에 의하여 결정되고 구체적으로 변수를 저장할 기억 장소와 변수의 유효범위를 결정합니다.
선언된 변수가 얼마 동안 기억 장소에 저장될 것인가를 결정하는 역할을 담당합니다.
자동 변수
- 형식 : auto 변수 선언 (함수내에서 선언)
예를들면 다음과 같습니다.
- 해석 :
- 어떤 함수의 내부에 선언되어 선언된 함수내의 프로그램에만 영향을 미치는 지역 변수임.
- 선언된 변수는 관련 함수가 실행중에만 사용되고, 함수의 실행이 종료되면 자동적으로 사라지므로 일시적인 기억공간을 이용함. (= 스택)
- 예약어 auto는 생략이 가능함. 따라서 C언어에서 사용되는 대부분의 변수는 auto 예약어가 생략된 자동 변수임
- 자동 변수는 변수를 선언할 때 초기화시키지 않으면, 임의의 값을 가짐.
- 실행 함수에서 선언된 인수는 실행 함수에서만 사용되는 자동 변수임.
- 자동 변수는 다른 함수나 블록이 자동 변수를 변경시키지 못하므로 안정성있고 융통성있는 변수임.
외부 변수
- 해석 :
- 어떤 함수의 밖에서 정의하고 선언된 장소 아래에 있는 모든 함수들에 영향을 미치는 전역 변수임.
- 프로그램의 실행이 종료될 때까지 기억 공간이 유지되며, 기억 장소는 주기억 장치를 이용함.
- 소스 프로그램이 두 개 이상 존재하는 경우에는 한 소스 프로그램에서 다른 소스 프로그램의 외부 변수를 이용하고자 할 때 예약어 extern을 이용함.
- 외부 변수의 초기화는 컴파일시에 한번만 이뤄지는데 초기값은 외부 변수를 정의할 때 주어져야 함. 만약 초기값이 주어지지 않을 경우 변수의 자료형에 따라 정해진 값으로 다음처럼 초기화 됨.
- char --> '\0', int --> 0, float 및 double --> 0.0
- 한 개의 프로그램안에 지역 변수와 외부 변수가 중복하여 선언되어 있는 경우 지역 변수의 값이 우선함.
- 외부 변수를 사용하는 경우
프로그램에서 사용되는 모든 변수를 외부 변수로 선언하면 함수내에서 변수를 개별적으로 선언할 필요가 없습니다.
또한 인수 처리에 신경을 쓸 필요가 없게 되지만, 변수명의 충돌과 모듈의 독립성 저하에 주의해야 할 사항이 발생하게 됩니다.
그러므로 외부 변수를 많이 사용하는 프로그래밍 방식은 이 점 때문에 바람직하지 않는 것입니다.
외부 변수를 사용하는 경우는 프로그램 전체를 총괄하는 변수, 그리고 프로그램 전체의 상황을 기억하는 변수의 경우입니다.
가령 프로그램이 현재 어떤 상태의 모드로 실행되고 있는지를 나타내는 변수 + 그때까지 발생한 오류의 총 수를 보존하는 어떤 변수는 외부 변수로 표현하는 것이 더 낫습니다.
- extern 예약어의 사용
소스 프로그램이 두 개 이상 존재할 때 한 소스 프로그램에서 다른 소스 프로그램의 외부 변수를 이용하고자 할 때는 에약어 extern을 이용합니다.
정적 변수
- 형식 : static 변수 선언
바로 예시 갑시다.
- 해석 :
- 유효 범위는 선언된 함수 또는 블록내에서만 영향을 미치는 지역 변수임
- 변수의 기억 장소는 주기억 장치임. 프로그램의 실행이 종료될 때까지 기억 장소가 유지됨. 따라서 그 변수가 선언된 블록의 실행이 종료되어도 기억 장소가 유지되므로 이후 그 블록이 다시 실행될 떄는 이전 기억값이 그대로 사용됨.
- 정적 변수의 초기화는 외부 변수와 마찬가지로 컴파일시에 한번만 이뤄짐. 만일 변수에 초기값을 지정하지 않는 경우, 컴파일러는 변수의 자료형에 따라서 다음과 같은 값으로 초기화시키는 것으로 약속됨.
- char --> '\0', int --> 0, float 및 double --> 0.0
레지스터 변수
- 형식 : register 변수 선언 (함수내에서 선언)
말이 필요없이 보여드립니다.
- 해석 :
- 어떤 함수의 내부에 선언되어 선언된 함수내의 프로그램에만 영향을 미치는 지역 변수임. 관련 함수가 실행중에만 사용되고 함수의 실행이 종료되면 자동적으로 소멸되므로 기능적 측면에서는 자동 변수와 같음. 하지만 기억 장소가 프로세스의 레지스터라는 점이 다름
- 기억 장소가 레지스터이므로 주기억 장치에 기억된 자료를 연산하는 것보다 레지스터의 내용을 연산하는 것이 더 빠름. 당연히 수행 속도를 높일 수 있음.
- 프로세시의 레지스터는 개수가 한정되어 있음. 따라서 선언된 레지스터 변수중에서 배정이 가능한 개수만큼 할당되고 모자라는 것은 자동 변수로 사용됨.
- 레지스터 변수로 사용 가능한 형은 int, char 등이 있음. 또한 레지스터 변수에 대한 연산은 허용되지 않음.
'IT > C 언어' 카테고리의 다른 글
C언어 입출력 함수 - 버퍼드 입력, 버퍼되지 않는 입력 알아보기 (0) | 2020.08.19 |
---|---|
C언어 - 함수의 정의와 함수 작성방법 (0) | 2020.08.14 |
C언어 연산자 종류와 우선순위 (왕초보 개념잡기) (0) | 2020.08.13 |
C언어 변수의 정의와 종류 알아보기 (0) | 2020.08.13 |
C 언어의 고유한 10가지 특징 (0) | 2020.08.07 |
댓글