자료출처 : 권남수님의 Game Programming을 위한 C 강의


기억 클래스


㈜ 초보의 글이므로 잘못되거나 서투른 표현이 있을 것입니다. 그러나 읽는 분을 위해 최선을....



--------------------------------------------------------------------------------
◆ 결론 : 메모리의 구성 요소와 변수의 - 성질에 따른 - 종류를 이해한다.

--------------------------------------------------------------------------------
◇ 읽어주세요 : 제가 전체 개념에 대한 충분한 이해는 부족하나 나름대로의 논리로 개념 전달이 되도록 설명해 보겠습니다. 잘못된 부분은 바로 지적해 주시면 고맙겠습니다. 우선 아래 내용들이 게임 제작을 할 때만은 자세히 모른다고 해도 - 제 경험상 - 일단 그리 큰 문제는 되지 않을 것으로 판단됩니다. 가볍게 이해하는 방향으로 생각해 주시기를.

여기서는 기억클래스라는 개념과 이와 관계있는 변수의 종류에 대해 살펴본다.
지금까지는 모든 것을 main()함수 내부에서만 처리했기에 전역 변수나 지역 변수에 대한 구별을 할 필요가 없었다. 그러나, 모든 프로그램을 main함수 안에서만 처리한다면 합리적이고, 능률적인 모듈화가 결코 되지 않을 것이다. 그래서 결국 여러개의 화일들로 쪼개서 프로그램을 짜게 되는 것인데..

C는 변수를 선언하고 또 사용한다. 그러면 그 변수는 보통 블럭(즉, {}로 묶여진 부분을 말함) 내부에서만 통용된다. 그러나, main 함수 외에 다양한 함수를 사용하다 보면 때로는 하나의 변수명으로 여러 함수에서 두루 두루 사용하게 할 필요도 있다. 그래서 이렇게 다양한 성질을 가진 변수들이 필요하게 되는데 이 장에서는 그런 변수의 성질을 공부하게 된다.

1. 기억 클래스와 유효범위
내가 설정한 변수는 메모리(주기억장치)에 위치하게 된다. 그런데, 때로는 메모리보다 속도가 더 빠른 cpu의 레지스터에 의도적으로 저장시키기도 한다. 이렇게 변수를 저장시키는 그 '장소'를 - 그 존속 시간까지 포한된 개념이지만 - 기억 클래스라고 부르고, 변수가 일정한 시간까지 생존하는 것도 사실상 중요한데 이것을 유효범위라고 한다. (아무튼 기억 클래스란 메모리뿐만 아니라 레지스터도 포함되는 말이다.)

한편, 메모리 내부는 일단 간단하게 3가지 - 정적 영역, 스택 영역, Heap 영역 - 으로 나눌 수 있다. 그런데, Heap 영역은 아예 빼두고 생각해야 될 것이다. 왜냐하면 이 Heap 영역은 - 포인터를 사용하면서 - 프로그램의 실행 중에 변수를 할당시키는 소위 동적 할당을 할 때 사용되는 영역인데 지금 우리가 여기서 살펴 볼 내용이란 - 동적이 아닌 - 프로그램을 실행시키기 전에 변수를 할당시키는 바로 정적 할당에 대한 것만을 살펴보려고 하기 때문이다. 따라서 정적영역, 스택 영역 그리고 레지스터에 대한 것만이 우리 의 공부 대상이 되는데 이제 이와 관련이 되는 변수에 대해서 알아보자.

2. 변수의 기억클래스
변수의 기억클래스에는 4가지 즉, auto, static, extern, register가 있다. 이들 4가지를 편의상 변수의 종류라고 생각해 두는 것이 이해가 빠를 것 같다. 우선 이들의 각각의 특성을 알아본다.

① 자동변수(auto) = 지역변수(local)
일반적으로 얘기하는 변수가 바로 이것이다. 즉, int i; 식의 형태인데 함수의 - 외부가 아닌 - 내부에서만 작동되는 성질을 가지고 있다. 이들은 메모리의 스택 영역에 저장된다.

② 외부변수(extern) = 전역변수(global)
이것은 ①의 지역변수(local)와 상대되는 개념으로 프로그램 전체에 걸쳐 사용된다. 따라서 프로그래머가 혼동을 할 가능성이 많은 변수이기에 가급적 사용을 피하는 것이 좋을 것이다. 또한, 사용방법에 있어 실제 게임 소스에서는 main.cpp 화일과 연관된 .h(헤더 화일)와 같은 별도의 화일에 변수를 설정해 두고 extern int i; 식으로 표현하면서 사용하기도 한다. 이 변수도 지속성이 필요하기에 정적 영역에 저장된다.

만약, 같은 변수명이 지역변수와 전역변수로 사용되었다면 지역변수에 우선권이 있기에 이것이 먼저 적용된다.

③ 정적변수(static)
쓰는 형식은 static int i;와 같이 표현된다. 기능은 ①의 자동변수와 같지만 차이점은 함수가 종료된 후에도 변수는 소멸되지 않는 점이 다르다. (그런 의미에서 ②의 전역변수의 성질도 갖춘 '짬뽕'식의 변수이다.) 그 이유는 메모리의 정적 영역에 할당되기 때문이다. 그래서 실제 사용에 있어 다소 혼동이 될 수 있는 성질의 변수이다. (값이 계속 존속될 듯?)

정리해 보자. 변수가 스택 영역에 들어가 있을 때는 함수가 종료되면 변수도 바로 소멸되지만, 메모리의 정적 영역에 변수가 있을 때는 프로그램 - 전체 - 자체가 종료되기 전까지는 존속하는 성질이 있기 때문이다. 즉, 스택이란 휘발성이 아주 강한 메모리의 영역이다. (정적변수의 예)



④ 레지스터(register)변수
register int i; 식으로 표현되는데 ①의 자동변수와 기능은 같다. 차이점이란 기억 장소가 메모리가 아니라 cpu의 레지스터라는 점이 다르다. 장점은 따라서 속도가 빠르다는 점이다.

그 밖에 '외부정적변수'라는 것도 있는데 잘 쓰이는지 않는 것 같다.

3. 정리
위의 내용들을 정리하면 다음과 같이 쉽게 이해될 수 있다. 각각의 변수들이 저장되는 위치를 따져보면
① 보통의 변수인 즉, (자동, 지역) 변수는 모두 휘발성이 강하여 메모리의 스택 영역에 일시적으로 저장되었다가 바로 사라지는데, 그래서 존속기간도 매우 짧다.

② 레지스터 변수는 cpu의 레지스터라는 특별한 위치에 저장되는 특징이 있고, 속도는 더욱 빠르지만 존속기간은 역시 보통의 변수처럼 짧다. 그래서 레지스터 공간이 부족하면 바로 스택에 저장된다. (즉, 저장되는 위치만 다를 뿐이지 결국 보통의 변수와 성질이 같다.)

③ 그러나, 나머지의 변수들 - 정적변수, 외부변수(=전역변수), 외부정적변수 -은 메모리의 정적 영역에 위치하면서, 프로그램이 끝날 때까지 계속 존속하게 되는 긴 유효범위를 가지고 있다.

또한, 메모리의 위치를 따져보면 정적 영역은 낮은 번지에 있고, 스택 영역은 높은 번지에 위치한다.
(끝)

2005/08/19 04:15 2005/08/19 04:15
Trackback address :: http://4ellene.net/tt/trackback/319

Comments List

  1. bdsm in london 2008/05/23 05:01

  2. phat latina ass 2008/05/23 07:43

    嫄몄

Write a comment.

[로그인][오픈아이디란?]