노는게 제일 좋습니다.

8회차 : 기억부류(스토리지 클래스) 본문

C

8회차 : 기억부류(스토리지 클래스)

노는게 제일 좋습니다. 2017. 2. 8. 04:52

1. 기억 부류의 종류 : 전역, 지역, 정적, 레지스터


2. 지역변수와 전역변수의 차이


정적 데이터 영역 : 프로그램 코드 다음에 위치하는 한 부분. 프로그램 실행 시 메모리에 로드되어 계속 유지.

지역 변수의 장점 : 함수의 독립성 높임, 메모리 절약, 디버깅 효율 향상, 특별한 기법 사용(재귀 호출, 상호 호출)

* 지역 변수를 자동 변수(Automatic Variable)라고도 부른다. 자동으로 생성되어 자동으로 파괴되기 때문.

* 지역 변수의 통용 범위는 정확히 말하면 { } 블럭 내부이다. 블럭 바깥에서는 못쓴다.

* 지역 변수가 파괴되는 시점은 컴파일러마다 다르다. 보통은 for문에서 만든 변수는 루프가 끝나면 파괴된다.


* 함수 내에서는 같은이름의 전역 변수, 지역 변수가 있다면. 지역 변수를 우선으로 택한다.


3. 외부 변수

extern int a=5; 와 같이 변수 선언시에 앞에 '지정자'라는 것을 붙일 수 있다.

지정자란, 변수의 여러 가지 성질을 지정하는 키워드이다.

그 중에서 extern은 이 변수가 블록 바깥에서 만들어진 변수임을 선언한다.


4. 정적 변수(Static Variable)

선언된 구역 내에서만 사용할 수 있고, 프로그램이 종료될 때 까지 유지된다.

예를 들어, 첫 번째, 함수 int a() 내에서 정적 변수 sv가 선언된 경우, a 내부에서만 사용가능하다. 이 경우에 sv를 내부 정적변수 라고 한다.

두 번째, 만약 한 모듈 ss.c 에서 정적 변수 sv가 선언된 경우 모듈 ss.c 내에서만 사용 가능하다. (다른 모듈에서 외부 변수로 참조할 수 없다). 이 경우에 sv를 외부 정적변수 라고 한다.



위 사진은 levelUp() 함수에 정적 정수형 변수 level을 선언해 사용한다.

초기화는 처음 한 번만 한다.


5. 정적 함수(static function)

정적 변수와 마찬가지로, 외부에 알려지지 않고 모듈 내에서만 사용할 수 있다.

큰 프로젝트를 진행할 때 함수 이름이 겹쳐서 충돌하는 문제를 막아준다.

static int plus(int a, int b){ ... }


6. 레지스터 변수

메모리에 저장되지 않고, CPU의 레지스터에 저장되는 변수이다. 특징은, 빠르다.

CPU의 레지스터 크기에 맞는 변수만 넣을 수 있다. 또, 지역 변수로만 선언할 수 있다. (전역 변수 안됨).

register int i=5;

printf("%d",i); // 5

레지스터형으로 선언할 때 몇 개 까지만 레지스터형이 되고, 어느 한계 이후부터는 지역 변수로 처리한다.

컴파일러에 따라 아예 그냥 지역변수로 넣어버릴 수도 있다.


7. 선언과 정의

둘은 완전히 다른 말이지만, 실제 말을 할 때는 그게 그것인 것 마냥 쓴다.

선언은 컴파일러에 존재를 알리는 것이다. 메모리에 할당되지 않으며, 중복해도 된다.

정의는 어떤 것을 만드는 것으로, 메모리에 일정 공간이 할당된다. 중복될 수는 없다.


선언의 예로는 외부 변수(extern int a;)와 매크로 #define 이다. 근데 매크로 명령어가 '정의'라는 뜻이다 ㅋㅋ

정의의 예는 지역변수를 정의하는 경우이다. 선언할 수 없다. 근데 int i;를 선언문이라 하기도 한다고 한다.

'C' 카테고리의 다른 글

10회차 : 배열  (0) 2017.02.11
9회차 : 표준함수  (0) 2017.02.11
7회차 : 함수 호출 방식, 전처리기  (0) 2017.02.07
6회차 : 함수의 구성 원리, 헤더 파일  (0) 2017.02.03
5회차 : 기타 연산자, 연산 규칙  (0) 2017.02.02
Comments