C는 데이터를 메모리에 저장하기 위해 변수들을 서로다른 다섯가지의 기억 모델, 즉 저장 클래스(storage class)를 제공한다.
저장된 각 값은 물리적인 메모리를 차지한다. C학문은 그런 메모리 덩어리에 대해 객체(object)라는 용어를 사용한다.
한 객체에는 하나 또는 그 이상의 값들을 저장해야 한다.
프로그램은 객체에 접속하는 방법을 필요로 한다. 이것은 예를 들어 변수를 정의함으로써 수행된다.
저장기간 또는 저장 수명(storage duration)이라는 용어로 객체를 설명한다면, 어라마나 오랫동안 메모리에 유지될 수 있는지를 나타낸다.
범위(scope)와 연계(linkage)로 객체를 접속하는데 사용된 식별자를 설명한다면, 이들은 함께한 프로그램의 어떤 부분들이 그것을 사용할 수 있는지를 정한다. 저장 클래스에 따라 범위, 연계, 저장기간의 다른 조합이 만들어진다.
프로그램의 수명과 운명을 같이하는 변수와, 자신이 포함된 함수가 실행중일 동안에만 존재하는 객체가 있다. 그리고, 특정 스레드(thread)기간 동안에만 존재하는 오브젝트도 있다.
범위(scope) : 프로그램이 어떤 식별자에 접근할 수 있는 영역을 나타낸다. C의 변수는 블록 범위, 함수 프로토 타입 범위, 파일 범위중 어느 한가지 범위를 가진다.
정의가 어떤 함수에도 속하지 않고 함수들의 바깥에 놓여 있는 변수는 파일 범위를 가진다.
C의 변수는 외부연계(external linkage), 내부 연계(internal linkage), 무연계(no linkage)중 어느 하나를 가진다. 블록 범위 변수나 함수 범위 변수, 즉 함수 프로토 타입 범위 변수는 연계를 가지지 않는다. 이말은, 그들이 정의된 블록이나 함수, 즉 프로토 타입에만 적용된다는 뜻이다.
파일범위 변수는 내부 연계나 외부 연계중 어느하나를 가질 수 있다. 외부 연계를 가지는 변수는, 다중 파일 프로그램의 어디에서나 사용할 수 있다. 내부연계를 가지는 변수는 한 파일 안의 어디에서나 사용할 수 있다. 파일 범위 변수들은, 하나 이상의 함수에서 사용할 수 있기 때문에, 전역 변수라고도 부른다.
ex)
int abc = 5; //파일 범위, 외부연계
static int def = 6; //파일 범위, 내부 연계
int main()
{
......
}
외부연계 : 여러 파일로 구성된 프로그램의 어디에서나 사용될 수 있다.
내부 연계 : 하나의 파일안의 어디에서나 사용될 수 있다.
무연계 : 블록 범위 변수나 프로토 타입 범위 변수는 연계를 가지지 않는다.
저장수명은 식별자들로 접속하는 객체들의 지속성을 나타낸다. C객체는 다음 네가지 수명(정적 수명(static duration), 스레드 수명(thread duration), 자동 수명(automatic duration), 할당된 수명(allocated duration))중 한가지를 갖고 있다.
정적 수명을 갖는 객체는 프로그램이 실행되는 동안에 내내 존재한다. 파일범위 변수에 대해서 키워드 static은 수명이 아니라 연계유형을 나타낸다. static을 사용해 선언된 한 파일 범위 변수는 내부 연결을 갖지만, 내부 연결이나 외부 연결을 사용한 모든 파일 범위 변수들은 정적 수명을 갖는다.
스레드 수명은 프로그램 실행이 여러 스레드로 분할 될수 있는 동시 프로그래밍으로 실행하게 된다. 스레드 수명은 그것이 선언되었을 때부터 스레드가 종료될 때까지 존재한다. 그러한 객체는 파일 범위 객체가 선언되거나 그렇지 않으면 키워드 _Thread_local 로 수정되는 파일 범위 객체가 만들어지든가 할 때 만들어진다.
블록 범위 변수는 일반적으로 자동 수명을 가진다. 일반적으로 블록범위 변수들은, 그들이 정의된 블록에 프로그램이 진입할 때 메모리가 할당되고, 프로그램이 블록을 탈출 할 때 메모리가 해제된다. 예를 들어, 하나의 함수 호출이 종료되었을 때, 그 함수의 변수들이 사용했던 메모리는 다음번에 호출된 함수의 변수들에 의해 사용될 수 있다.
지역 변수들은 모두 자동수명을 가진다. 그러나 변수는 블록범위를 갖는 동시에 정적인 수명을 가질 수 있다. 이러한 변수를 만들려면 블록안에서 선언하고 키워드 static을 선언에 추가한다.
'Programming > C' 카테고리의 다른 글
C언어 공부 23 (0) | 2019.05.31 |
---|---|
C언어 공부 22 (0) | 2019.05.31 |
C언어 오목 만들기 (0) | 2019.05.29 |
C언어 공부 20 (0) | 2019.05.29 |
C언어 공부 19 (0) | 2019.05.29 |