C는 범위, 연계, 수명을 사용하여 블록범위를 가지는 자동, 레지스터, 무연계 정적 저장 클래스와, 파일 범위를 가지는 외부 연계 정적과 내부연계 정적이라는 다섯가지의 저장 클래스를 정의한다.
저장클래스 수명 범위 연계 선언방법
자동 자동 블록 없음 블록안에
레지스터 자동 블록 없음 블록안에 키워드 register로
정적 외부연계 정적 파일 외부 모든 함수들의 바깥에
정적 내부연계 정적 파일 내부 모든 함수들의 바깥에 키워드 static으로
정적 무연계 정적 블록 없음 블록안에 키워드 static으로
자동 저장 클래스에 속하는 변수는 자동 수명, 블록 범위, 무연계를 가진다.
블록안에 또는 함수 머리 안에 선언된 변수는 기본적으로 자동 저장 클래스에 속한다. 그러나 프로그래머의 의도를 확실하게 하기 위해 키워드 auto를 명시적으로 사용할 수 있다.
블록 범위와 무연계라는 것은, 그 변수가 정의된 블록 안에서만 이름을 통해 그 변수에 접근할 수 있는 것을 의미한다.
자동저장 수명의 경우에, 변수 선언이 들어있는 블록에 프로그램이 진입할 때 변수가 생성된다는 것을 상기하라. 프로그램이 블록을 탈출 할 때 자동 변수는 소멸된다. 이제 그 메모리 위치는 다른용도로 사용될 수 있다.
일반적으로 변수는 컴퓨터 메모리에 저장된다. 운이 좋은 레지스터 변수들은, CPU 레지스터에 또는 좀더 일반적으로 사용할 수 있는 가장 빠른 메모리에 저장된다.
레지스터 변수는 블록범위, 무연계, 자동수명을 가진다. 레지스터 변수는 저장클래스 지정자 register를 사용하여 선언한다.
정적변수(static variable)라는 이름은, 마치 변할 수 없는 변수를 의미한 것 같아 모순처럼 들린다. 그러나 정적(static)이라는 말이 실제로 의미하는 것은, 변수가 메모리에 그대로 유지된다는 것을 의미한다.
static 즉 정적 변수는 컴파일 될 때 단 한번만 초기화 된다. 디버거를 사용하여 프로그램을 한단계씩 실행시켜보면 프로그램이 그 단계를 건너 뛰는 것을 볼 수 있다. 프로그램이 적재된 후에는 정적 변수와 외부 변수들이 이미 자리를 차지하고 있기 때문이다.
외부연계 정적 변수는 파일 범위, 파일범위, 외부연계, 정적 수명을 가진다. 이 저장클래스를 때로는 외부저장 클래스(external storage class)라고 부르고, 이 유형의 변수들은 외부 변수(external vriable)라고 부른다. 외부 변수는 어떤 함수에도 속하지 않게 함수의 외부에 정의 선언을 놓음으로써 생성한다.
외부 변수는 키워드 extern을 사용하여 그 변수를 사용하는 함수 안에 추가로 재선언 할 수 있다. 그 변수가 다른 파일에 정의되어 있다면, 그 변수는 반드시 extern 키워드로 선언해야 한다. 특정 외부 변수가 한 소스코드에 저으이되어 있고 두번째 소스코드 파일에 사용된다면, 반드시 두번째 파일에 extern으로 변수를 선언해야한다.
외부 변수는 사용자가 초기화 하지 않으면 자동으로 0으로 초기화된다.
외부 정의를 생성하려면 키워드 extern을 사용하면 안된다. 이미 존재하는 외부 정의를 참조하는 용도로만 extern을 사용해야 한다. 외부 변수는 단한번만 초기화 할 수있다. 그 초기화는 변수가 저으이될 때 이루어 져야한다.
키워드 extern은 어디에 있는지 찾아보라고 컴파일러에게 지시하는것이다.
내부연계 정적 변수는 정적 수명, 파일 범위, 내부연계를 가진다. 이 변수는, 어떤 함수에도 속하지 않고 함수들의 바깥에 저장 하며 클래스 지정자 static을 사용하여 정의한다.
하나의 파일에서 정의된 외부 변수는, 다른 파일에서 (extern을 사용하여)선언하지 않는한, 다른 파일에서 사용할 수 없다. 외부 선언 자체는 다른 파일들이 잠재적으로 그 변수를 사용할 수 있도록 만들 뿐이다.
함수들도 저장 클래스를 가진다. 함수는 외부(디폴트) 또는 정적 둘중 하나를 가질 수 있다. 외부함수는 다른 파일에 들어 있는 함수들이 사용할 수 있다. 그러나 정적 함수는 그 함수가 정의된 파일에 들어 있는 함수들 만이 사용할 수 있다.
함수에 static 저장 클래스를 사용하는 한가지 이유는, 함수들을 특정 모듈에만 사용할 수 있게 만들어 이름들이 충돌할 가능성을 피하는 것이다.
C라이브러리는, 난수들을 발생시키는 rand()라는 함수를 제공한다. rand()함수는 '종자값(seed)'를 사용하여 새로운 수를 만든다. 그 수가 새로운 종자값이 된다. 그러고 나서 새로운 종자값은 더 새로운 종자값을 만든다.
위 설계가 제대로 동작하려면, 난수함수는 바로 이전의 호출에서 사용한 종자값을 기억해야 한다.
'Programming > C' 카테고리의 다른 글
C언어 공부 24 (0) | 2019.05.31 |
---|---|
C언어 공부 23 (0) | 2019.05.31 |
C언어 공부 21 (0) | 2019.05.30 |
C언어 오목 만들기 (0) | 2019.05.29 |
C언어 공부 20 (0) | 2019.05.29 |