C# 메모리 관리 – 메모리 존

메모리 관리

 

memory management

 

메모리 관리

이 강좌는 특히 유니티 개발을 위해서 C#을 익히려는 C/C++ 프로그래머에게 유용합니다. C#은 메모리를 다른 방식으로 관리하기 때문에,
매우 혼동스럽거나 처음에는 마법같이 보일 수 있지만 다른 시스템들과 마찬가지로 눈에 잘 띄지 않는 위험과 특이한 점이 많습니다.
유니티로 프로그래밍을 시작하거나 일반적으로 프로그래밍을 시작할 때 대부분 변수 타입에 관심이 집중됩니다.
예를 들어, 어떤 변수는 업데이트가 되는 데, 다른 변수는 그 값이 같은 상태로 남아있고,
아직 변수가 필요한 데 사라져 있는 경우 등이 그 예가 될 수 있습니다.

또한 프로그래밍을 시작하는 분들에게 공통된 이슈 중 하나는 정적 변수(static variable) 사용에 대한 내용입니다.
인터넷 상의 많은 강좌에서 정적 변수를 사용하는 것을 종종볼 수 있는데, 대부분 이에 대해서 시간을 할애해서 설명하는 경우는 드믈고,
“변수에 대한 쉬운 접근”이라고만 설명되는 경우가 많습니다.

문제는, 정적 변수(클래스 변수라고도 합니다)는 결코 쉬운 주제가 아니라는 것입니다.

누군가는 문제를 단순화시키기 위해서 정적 변수로 할 수 있는 것은 다른 타입으로 얼마든지 대체가 가능하다며, 정적 변수의 사용을 피하라고 합니다.
이 것이 사실인지 천천히 살펴볼 예정이며, 반드시 최선의 해결책은 아니라는 것을 살펴보겠습니다.

시작하기 전에, 여러분이 혹시 C언어에 대한 배경 지식만 있고 객체-지향 프로그래밍에 대한 지식이 없는 경우,
여러분이 알고 있는 메모리 관리 및 저장 키워드(storage keyword)가 객체지향 프로그래밍과 매우 다르다는 점을 명심하세요.
C의 사용방법을 C#에 적용하지 않는 것이 좋습니다.

본 강좌에서 서로 다른 방식의 메모리 존(memory zone), 값 타입(value type), 참조 타입(reference type),
동적 메모리 할당(dynamic memory allocation), 정적 변수(static variable)에 대한 내용을 다룰 예정입니다.

메모리 존 (Memory Zone)
프로그램을 시작할 때, 운영 체제는 프로그램의 각 부분에 필요한 메모리를 할당합니다.
콜 스택(call stack), 힙(heap), 레지스터(register), 정적 메모리(static memory) 이렇게 4가지의 메인 메모리 존이 있었습니다.

C# 언어를 사용하는 개발자들은 이 4가지 메모리 존을 스택과 힙 2가지로 좁힐 필요하가 있습니다.
스택은 정렬되어 있고 빠르지만 사용이 제한적입니다. 힙은 위치가 정해져 있지 않고, 용량이 큰 대신 느립니다.

프로그래머는 각 변수의 목적 및 변수의 운명에 따라서 어떤 메모리 존을 사용할 지 정할 수 있습니다.
audo, static(나중에 살펴보겠습니다)그리고 extern 이렇게, 메모리 할당에 사용되는 3개의 저장 키워드(C에서는 네번째 키워드인, register가 더 있습니다)가 있습니다.

extern은 그리 반갑지 않은 키워드입니다. 이 키워드는 프로젝트 외부에서 선언된 변수를 선언한다는 의미를 갖습니다
– 예) .Net 언어가 아닌 다른 언어에서 작성된 DLL 플러그인에 있는 변수.

여러분이 C 프로그래머라면, extern 키워드가 C#에서 조금 다른 의미를 갖는 다는 점에 주의 해야합니다.
C#에서 extern은 해당 변수가 managed memory에 할당되지 않는 다는 의미를 갖습니다.

extern int number;

컴파일러는 number 변수를 위한 메모리를 할당하지 않고, 이 변수가 다른 곳에 위치하도록 합니다. 본 강좌에서는 이 내용을 더 다루지는 않겠습니다.
이에 대한 자세한 내용이 궁금하신 분들은 이 곳에서 자세한 내용을 참고하시기 바랍니다.

 

RonnieJ

프리랜서 IT강사로 활동하고 있습니다. 게임 개발, C++/C#, 1인 기업에 관심이 많습니다.

답글 남기기

이메일 주소는 공개되지 않습니다.

Please turn AdBlock off

Notice for AdBlock users

Please turn AdBlock off