[C언어] 동적 할당? ( memory allocation )
◎ 쓰게 된 계기 ◎
학원 코딩 알바를 하며 나는 c언어와 알고리즘을 가르친다.
한 학생이 나에게 물어봤다.
굳이 동적 할당을 안하고 배열을 써서 값을 배출하면 되는데 왜 굳이 동적할당을 쓰는 이유가 뭘까? 라는 의문이였다.
나 또한 동적할당을 배울 때 어떻게 쓰는지만 알고 사용하는 이유를 정확히 이해도 못하고 사용도 하지 않았다.
▶ 동적할당이란?
프로그래밍 하는 중에 메모리 공간을 사용할 양만큼 할당하는 방법
▶ 동적 할당이 정말 필요할까?
동적과 정적의 차이를 알아가며 동적할당의 사용 이유를 알아야한다.
정적할당을 하여 우리가 컴파일 하는 경우는 일반적으로 간단하다.
변수를 하나 지정해서 그냥 그 값을 출력하는 방법 자체도 정적이다.
즉, 프로그램이 실행 되기 전에는 메모리가 필요하기에
코드를 읽고 얼마의 메모리 공간이 필요한지 알고 확보하는 것이다.
이 과정도 정적 할당이다.
그래서 프로그램은 텍스트로 우리가 짠 코드와 명령어들이 이루어져 정적인 특징을 가지고 있다.
이렇게 컴파일 단계에서 코드를 읽고 공간을 확보하는 방식이라는 것을 알았다.
동적할당은 그럼 어떻게 동작이 될까?
솔직히 정적인 방식으로 메모리를 불러와도 괜찮은거 아닐까?
진짜 상관 없고 필요없다고 예전에 많이 느꼈다.
하지만 메모리라는 것은 유한 자원으로써 한정되어있다.
예를 들어보겠다.
우리가 사과 박스를 저장하기 위해서 1000평짜리 저장고를 만들었다.
하지만 실제로 사과 박스를 1,2개 밖에 저장하지 않는다면 이 1000평짜리 저장고를 굳이 만들 필요가 있을까?
사용하려는 메모리 공간을 효율적으로 사용하지 않는거다.
이 점에서 동적할당이 필요한 이유다.
동적 할당은 우리가 필요한 만큼만 메모리 공간을 확보한다.
그럼 다시 예로 가면 이번에 전재가 다르다.
사과 박스를 저장하기 위해서 1000평 짜리 저장고를 만드는 것이 아니라
사과 박스의 갯수를 보고 저장고를 만드는 것이다.
이렇게 메모리 공간을 지정해주어 메모리를 효율적으로 사용하는 것이다.
▶ 동적 메모리 할당
c언어에서 동적 할당은 힙 영역에서 필요한 메모리 공간을 그때마다 할당 해주고
c언어에서 힙(heap)이란 쉽게 말해서 동적 할당하는 메모리들이 들어가는 공간이라고 생각하면 됨.
메모리를 더 이상 사용하지 않아도 될 때 해제하는 과정까지를 동적 메모리 할당이라고 한다.
그래서 원하는 만큼 메모리를 할당하고 심지어 크기를 수정할 수도 있다.
그렇지만 c언어는 Garbage Collector가 존재하지 않는다.
Garbage Collector란 쉽게 말해 메모리에 할당해준 변수들은 내버려 두고 사용하지 않으면 그것 또한 메모리의
한 곳을 차지하는 쓰레기가 되는데 이것을 처리해주는 기능을 한다.
그래서 free라는 것으로 해제까지 해줘야한다.
▶ 쓰는법
#include <stdio.h>
int main ()
{
int *arr = (int*)malloc(30*sizeof(int));
free(arr);
}
malloc ? 앞서 설명했던 동적 할당의 대표적인 예이다.
int형의 공간을 30개 만들어 달라는 의미이다.
그래서 arr에는 int형으로 30개의 공간이 있게 되는 것이다.
또 calloc과 realloc이 있다.
#include <stdio.h>
int main ()
{
int *arr = (int*)calloc(30,sizeof(int));
free(arr)
}
calloc은 int형 사이즈를 30개 만들어라는 것으로 위의 malloc과 같은 크기를 같다.
두개의 다른 점은 calloc은 메모리에 할당된 값들을 전부 0으로 만든다는 점이다!
그래서 calloc은 잘 사용하지 않는다.
realloc은 이미 메모리가 할당된 변수의 크기를 변환 시킬 때 사용한다.
void* realloc(*void arr, size_t size )
이 코드를 해석하자면 arr을 size만큼 바꾸겠다는 의미가 된다.