Programming and my thoughts

앞서 포인터를 배우고 Call By Value, Call By Reference 를 공부했는데...

그럼... 실제 컴퓨터에서 프로그램을 실행할 때 기억 영역이 어떻게 구성되는지 살펴보자.



그림을 보면 조금씩 머리가 아파오나... 외우는 것이 아니라 이해하도록 하자.

실제 업무에서는 Heap 과 Stack 영역에 대한 이해만 확실히 하면 큰 무리가 없다.


1. Static Segment


정적 기억영역이라고 한다. Static 이라는 단어 자체가 "정적인" 이라는 의미를 가지고 있다.


> Code Segment

간단하다. 프로그램 코드가 이 영역에 저장된다.

매 프로그램 실행시마다 프로그램 코드는 여기에 적재되며...

함수를 호출할 때마다 컴퓨터가 여기 주소를 찾아가는 것이다.


예를들어...

A 라는 클래스의 인스턴스를 생성하여... A.plus() 라는 함수를 호출했다고 하면...

이 함수는 Code Segment 어딘가에 저장되어 있고, 컴퓨터는 여기를 찾아가는 것이다.


> Data Segment

전역적인 특성을 가진 기억영역이다.

  • 전역 변수 (global)
  • 리터럴 상수, 심볼릭 상수 (const, define)
  • 정적 변수 (static)

- 전역 변수는 어떤 것인지 알 것이다.


- 리터럴 상수와 심볼릭 상수에 대해 이야기해보자.


int a = 10

char* c = "찰리"

여기서 a 와 c 는 우리가 변수라고 부른다.

그리고 10 과 "찰리" 를 리터럴 상수라고 부른다.

10 은 컴퓨터 어딘가에 저장이 되어있다.

마찬가지로 "찰리" 라는 글자도 어딘가에 저장이 되어있기때문에 컴퓨터가 알고있는 것이다.


심볼릭 상수는 c 언어 소스코드를 보다보면...

const 와 define 키워드가 붙은 코드를 본 적이 있을 것이다.

const int a = 10

define LAST_BOSS = "대마왕"

여기서 a 와 LAST_BOSS 를 심볼릭 상수라고 부른다.

다들 알겠지만... 얘네들은 한 번 지정한 값이 변하지않는 특성을 가진다.


리터럴 상수와 심볼릭 상수를 구분하는 방법은 매우 간단하다.

리터럴 상수는 태생부터 상수인 것이다. 즉, 변하지않는다.

심볼릭 상수는 상수처럼 동작하라고 지정한 것이다. 즉, 상수와 동일하게 동작한다.


- 정적 변수도 어렵지않다.


void add_count() {

 static int count = 0;

 count++;

}


여기서 count 가 정적 변수이다.

이 변수는 프로그램을 실행하는 동안 단 한 번 초기화되며, 계속 이 값을 사용하게 된다.


2. Stack Segment


스택 영역이라고 하는데... Heap Segment 와 더불어 가장 핵심이 되는 영역이다.

  • 지역 변수
  • 형식 매개 변수
  • 임시 변수
  • 반환 주소

c 언어에서는 별도로 변수에 키워드를 지정하지않으면 auto 라는 키워드가 붙게되고... 이것은 지역 변수가 된다.

단, 포인터 변수에 메모리를 할당하여 쓰면... 이 포인터는 힙 영역(Heap Segment)를 바라보게 된다.


3. Heap Segment


힙 영역이라고 한다.

  • 동적 메모리를 사용하는 변수

A 라는 클래스가 있는데 A a = new A(); 이렇게 클래스 A 에 대한 인스턴스 a 를 만들었다고 생각해보자.

이 때에 a 는... 힙 영역에 저장된다.


List<string> lst = new List<string>(); 이라고 해서 리스트 lst 를 만들었다고 생각해보자.

이 역시 힙 영역에 저장된다.


동적 메모리를 활용하는 변수는 모두 힙 영역에 저장되는 것이다.

c, c++ 에서 힙 영역을 이용하기 위해서는 변수에 malloc, new 로써 메모리 공간을 할당해주어야 한다. (메모리 반환은 free, delete)




딱 보면 알겠지만 프로그램을 만들다보면 Stack 과 Heap 영역을 많이 쓸 수 밖에 없다.

또한... 프로그래머가 자유롭게 메모리를 할당할 수 있는 Heap 영역에서 Memory Leak 문제가 발생할 수 있다는 사실을 생각해볼 수 있다.

즉... 할당해서 다 쓴 뒤에 반환하지 않으면 문제가 되는 것이다.


레지스터 변수 (register) 라고 하는 것도 있는데 이것은 cpu 의 레지스터 영역이라고 하는 특수한 공간에 저장되어 빠르게 액세스할 수 있다. 나는 써본적이 없다 ~


끝 ~