메모리의 구조
메모리는 기본적으로 코드영역 와 스택영역 힙영역, 데이터 영역으로 나뉩니다.
코드영역은 실행할 명령어들이 순서대로 쌓이고 CPU가 코드영역에서 하나씩 가져가 처리를 하는방식이고
스택영역은 기본적으로 선형 자료구조로 메모리에 들어온 데이터들의 입구와 출구가 같습니다. 때문에 후입선출방식(FILO : First In Last Out, 처음 들어온 게 가장 마지막에 나간다.)으로 동작을 합니다.
힙 영역은 컴파일 시에 메모리를 할당하는 게 아니라 코드가 실행할 때 사용자로부터 할당메모리를 입력받기 때문에 동적메모리라고도 불립니다.
데이터 영역은 전역변수와 static 변수가 저장되는 메모리 영역으로 이 메모리는 프로그램이 종료를 하게 되면 같이 소멸하게 됩니다.
메모리의 할당
일반적으로 메모리의 할당은 컴파일타임에 이루어집니다.
하지만 우리가 정확하게 얼마나 메모리가 필요한지 알 수 없을 때가 있습니다. 예를 들어서
무한정으로 예매가 되는 영화예매 사이트라고 상상을 해봅시다.
기존에는 해당 시간이 최대 30개의 메모리가 필요했다면 무한정으로 예매가 되면 몇 개의 메모리가 필요하게 될까요? 정확한 값을 알 수 없습니다. 일단 30개로 잡고 부족할 때마다 늘려가는 방법도 있지만 불편함이 발생할 수 있겠죠? 이런 경우에 동적메모리 할당을 이용하게 되면 조금 더 유동적으로 메모리 값을 사용할 수 있게 됩니다.
데이터를 입력받아서 메모리를 생성할 수도 있지 않는가?라는 질문에 답을 드리면 에러가 발생하게 됩니다. 왜냐하면
int num;
fputs (학생수 입력 : stdout)
scanf (%d, &num);
int student[num];
이와 같은 코드가 존재할 때, 메모리 할당을 하는 컴파일 타임에 이미 int num과 int student[num]이라는 메모리 할당이 끝이 나게 됩니다. 이다음 코드가 실행이 되면 fputs~ scanf까지 동작을 하게 되는 것이죠. 즉, 코드 순서대로 진행이 되는 게 아니기 때문에 입력값은 사실상 이미 메모리 할당이 끝난 가장 마지막이 되는 것입니다. 실행시점이 다른 것입니다.
이걸 해결하기 위해서 동적메모리 할당은 malloc이라는 함수와 free라는 함수를 이용을 합니다.
malloc 함수는 괄호 안에 내가 할당받고 싶은 메모리를 바이트 단위로 입력을 해주면 그만큼의 메모리를 할당해 주고 더미로 된 포인터를 메모리 주소값으로 전달을 해줍니다.
이때 포인터는 타입이 구체적이지 않고 그냥 "일단 메모리만 할당해 놓을게"인 상태인 것입니다.
free함수는 malloc함수를 사용하고 나서 사용하는 함수로 malloc 함수로 메모리를 할당하게 되면 힙메모리에 메모리를 확보한 상태가 되는데요. 이렇게 malloc을 통해서 힙에서 할당된 메모리는 해제를 해주어야 합니다. 그 이유로는 힙에서 메모리 해제를 하지 않으면 메모리 누수가 생기기 때문입니다.
그렇다면 어떻게 malloc과 free함수를 어떻게 사용하는지 알아봅시다.
int num;
int *std;
scanf("%d", &num);
std = (int*)malloc(sizeof(int) * num);
free(std);
몇 개의 데이터가 필요한지 num을 통해 입력을 받고, 해당 자를 이용해 malloc함수에 필요한 값을 입력해 줍니다. 다 사용을 하고 나면 free함수를 통해서 할당된 주소값을 해제시켜 주는 것입니다.
프레임워크 언어들은 가비지 콜렉터라는 게 동작을 하기 때문에 따로 해제를 하지 않아도 메모리 누수가 일어나지 않습니다.
이와 같은 동적메모리 할당은 new연산자로 생성된 객체 생성 메모리 구조이니 공부하실 때 참고하면 좋을 것 같습니다.
예시 ) cat = new Animal();
cat : 스택메모리에 Animal 객체가 저장된 주소값이 저장
new Animal() : new를 이용하면 Animal이라는 객체에 필요한 메모리 용량을 계산해서 전체적으로 필요한 메모리를 얻을 수 있다.
'개발지식' 카테고리의 다른 글
오픈소스 문서 (0) | 2024.02.19 |
---|---|
오픈소스와 라이선스 (0) | 2024.02.14 |
컴파일 언어와 스크립트 언어 (0) | 2024.01.22 |
동기와 비동기, 블로킹과 논블로킹 (0) | 2024.01.11 |
Authentication과 로그인 (0) | 2023.12.25 |