포스트

지역 변수, 전역 변수, 정적 변수, 동적 변수

C언어에서는 데이터를 변수라는 식별자에 저장해서 언제든지 해당 메모리를 다시 접근해 데이터를 사용할 수 있게끔 되어 있습니다.

여기에서 몇 가지 알아야 할 부분은, 코드에서 각각 접근할 수 있는 영역입니다.

지역 변수 (자동 변수)

스택(Stack) 영역에 할당되는, 블록 안으로 사용 범위가 제한되는 변수입니다.

지역 변수는 블록(지역) 내에서만 사용되기 때문에 해당 블록 내에서만 접근 가능하며, 다른 블록(함수)에서는 사용할 수 없습니다.

또한, 블록이 종료되어 변수의 사용이 끝나면 메모리에서 제거되어 메모리 낭비를 줄일 수 있습니다.

전역 변수

Data 영역에 할당되어 프로그램 실행 시간동안 존재하는 변수입니다.

전역 변수는 프로그램이 실행될 때 데이터 영역(Data Segment)에 로드되고, 프로그램 전체에서 사용 가능한 변수입니다.

일반적인 전역 변수는 같은 파일 내에서 자유롭게 접근이 가능하며, 다른 파일에서도 extern 을 통해 접근이 가능합니다.

그러나, 전역 변수는 프로그램 실행 동안 계속 메모리에 남아 있으므로, 불필요한 전역 변수가 많을 경우에 메모리 사용이 비효율적일 수 있습니다.

또한, 전역 변수는 여러 함수에서 접근이 가능하기 때문에 프로그램의 복잡도를 증가시킬 수 있습니다.

정적 변수 (Static)

정적 변수는 지역 내에서 선언되지만, 프로그램의 실행 시간 동안 값이 유지되는 변수입니다.

데이터 영역에 할당되며, 한 번만 초기화됩니다.

정적 변수는 해당 지역 내에서만 접근 가능하며, 지역을 벗어나도 값이 유지됩니다. 따라서 함수 호출 사이에 상태를 유지해야 하는 경우 유용하게 사용할 수 있습니다.

다만, 전역 영역에서 선언된 정적 변수는 파일 내에서만 접근 가능하므로 전체 파일에서 접근하게 하려는 경우 전역 변수의 extern을 사용해야 합니다.

동적 변수

프로그램 실행 중Heap 영역에 할당하고 사용자가 해제할 때 까지 존재하는 변수입니다.

동적 변수는 프로그래머가 직접 메모리를 할당하고 해제하기 때문에, 메모리 사용에 대한 제어가 가능합니다.

동적 변수는 프로그램의 실행 중에 필요한 만큼만 메모리를 사용하게 되므로 메모리의 낭비를 줄일 수 있습니다. 또한, 동적 변수는 여러 함수에서 접근이 가능하기 때문에, 전역 변수와 유사한 기능을 수행할 수 있습니다.

그러나, 동적 변수를 해제하지 않고 접근 방법이 사라지게 된다면 메모리 누수가 발생할 수 있으므로 메모리 관리에 주의해야 합니다.

메모리 영역.png


지역변수는 스택에, 동적 변수는 힙에 할당하는 이유

지역 변수를 스택에 할당하는 이유

지역 변수를 스택에 할당하는 이유는 역순으로 안전하게 해제하기 위해서입니다.

함수가 호출될 경우 스택 프레임호출된 주소와 함께 지역 변수가 선언된 순서대로 스택에 할당 되는데, 이는 함수 종료시 이전 변수를 참조할 가능성이 있는 변수들을 안전하게 해제하기 위해서 입니다.

동적 변수를 에 할당하는 이유

동적 변수의 경우 중간에 할당하고 해제해 줄 수 있어야 하기 때문가변 영역에 할당합니다.

지역 변수와 달리 사용자가 직접 해제 할 때까지 존재하기 때문에 메모리 누수가 일어날 수 있습니다.

힙 메모리에 할당 할 때, 연속된 메모리 공간을 찾아야 하기 때문에 지역 변수보다 할당이 느리고, 해제 할 때 해제된 공간의 인접 공간을 찾아 병합하는 과정이 있어 성능이 저하 될 수 있습니다.

메모리 풀 없이 자주 동적 할당과 해제를 반복하면 메모리 단편화를 일으킬 수 있습니다.

메모리 풀
메모리 풀은 필요한 메모리 공간을 필요한 크기, 개수만큼 사용자가 직접 지정하여 미리 할당 받아 놓고 필요할 때마다 사용하고 반납하는 기법입니다.
이를 통해 메모리 단편화와 할당/해제의 성능 저하를 줄일 수 있습니다. 다만, 미리 공간을 할당 받기 때문에 메모리 풀을 사용하지 않으면 메모리 낭비가 될 수 있습니다.


참고

외부 변수와 extern, 그리고 외부 링크

[static 키워드] 01_전역 정적 변수와 지역 정적 변수

[static 키워드] 02_정적 멤버 변수

[static 키워드] 03_정적 멤버 함수

이 기사는 저작권자의 CC BY-NC-ND 4.0 라이센스를 따릅니다.