Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 사이드프로젝트
- 자바스크립트
- pintos
- Flutter
- 모션비트
- 소켓
- 크래프톤 정글
- Java
- 4기
- 핀토스
- 스택
- JavaScript
- Vue.js
- 티스토리챌린지
- userprog
- 리액트
- 크래프톤정글
- 나만무
- 오블완
- TiL
- corou
- 코드트리
- 큐
- CSS
- HTML
- 백준
- 자바
- 시스템콜
- 알고리즘
- defee
Archives
- Today
- Total
미새문지
크래프톤 정글 week04, day26 - 동적 메모리 할당, CBV, CBR 본문
728x90
동적 메모리 할당
- 실행 중(런타임)에 사용할 메모리 공간을 할당하는 것을 의미한다.
- 정적 할당(static allocation)
- 프로그램이 실행되기 위해서는 메모리가 필요한데 컴파일러는 컴파일 시점에 소스 코드를 읽고 변수 타입들의 크기에 따라 메모리를 할당한다.
- 동적 할당(dynamic allocation)
- 컴파일 타임이 아닌 프로그램 런타임에 필요한 만큼의 메모리 공간을 확보하는 것을 의미한다.
- 동적 할당이 필요한 이유
- 사용할 때마다 필요한 만큼만 메모리 공간을 확보하고 다 사용했다면, free시켜줌으로써 메모리 공간을 해제해 한정된 메모리 공간을 효율적으로 사용할 수 있게 된다.
- 함수가 종료되거나 변수의 영역을 벗어나면 자동으로 메모리가 해제되는 정적 할당은 스택에 저장된다. 하지만 동적 할당은 힙에 저장이 된다.
- 힙(heap) 영역
- 보다 큰 크기의 데이터를 담고자 동적으로 할당하는 메모리 공간을 지칭한다.
- 즉, 힙 영역에 필요할 때마다 메모리 공간을 할당하고, 더 이상 필요하지 않을 경우 메모리를 해제해주는 과정을 동적 할당이라고 한다.
- 장점
- 상황에 따라 원하는 크기의 메모리가 할당되므로 경제적이다(malloc or calloc)
- 이미 할당된 메모리라도 언제든 크기를 조정할 수 있다.(realloc)
- 단점
- c언어의 경우 GC(Garbage Collector)가 없기 때문에 개발자가 직접 메모리를 해제해줘야 한다.(free) 그렇지 않으면, 메모리 누수가 나타난다.
- 메모리 할당
- 프로그램이 실행되는 동안 메모리 공간을 동적으로 할당하거나 해제하는 과정을 동적 메모리 할당(dynamic memory allocation)이라고 부르며, 필요한 만큼의 메모리를 실행 중인 프로그램이 할당 받을 수 있게 한다.
- 메모리 할당 함수
- malloc() : 지정된 크기의 바이트만큼 메모리를 할당하며 할당된 메모리의 첫 번째 바이트에 대한 포인터를 반환한다. 이 함수는 할당된 메모리를 초기화하지 않는다.
int size = 10;
int* arr = (int*)malloc(sizeof(int)* size);
- calloc() : malloc과 비슷하지만, 두 가지 차이점이 있다.
- 할당된 메모리를 0으로 초기화 시킨다.
- malloc의 경우 메모리를 할당하면 쓰레기 값이 담겨있을 수 있는데, calloc은 메모리를 할당하면 해당 메모리 공간의 모든 바이트를 0으로 설정하거나 초기화 한다.
- 할당할 객체의 수와 각 객체의 크기를 인자로 받는다.
- malloc과 다르게 객체의 수와 크기를 받으면 알아서 연산을 해준다.
- 할당된 메모리를 0으로 초기화 시킨다.
int students = 10;
int* arr = (int*)calloc(students, sizeof(int));
- realloc() : 이미 할당된 메모리 블록의 크기를 변경한다. 이 함수는 새로운 크기의 메모리 블록에 대한 포인터를 반환한다.
- malloc이나 calloc으로 할당한 메모리를 변경해야 할 때 realloc을 사용한다.
- 프로그램의 요구사항에 따라 동적으로 메모리 크기를 조정할 수 있기 때문에 프로그램이 더 유연하게 메모리를 관리할 수 있게 해주며, 메모리 사용량을 최적화 할 수 있도록 도와주기도 한다.
int guests = 5;
int* chairs = (int*)malloc(sizeof(int) * guests);
guests += 3;
chairs = (int*)realloc(chairs, sizeof(int) * guests);
- free() : malloc, calloc, realloc등으로 할당된 메모리를 해제한다.
- 프로그램에서 사용이 끝난 메모리를 시스템에 반환해, 그 메모리를 다시 사용할 수 있게 해준다.
- 메모리 누수를 방지하는 중요한 방법이다.
int size = 10;
int* arr = (int*)malloc(sizeof(int)* size);
free(arr);
콜바이밸류(Call By Value)
- 다른 함수를 호출할 때 넘기는 값이 매개변수에 복사가 되어 함수 내에서 어떠한 데이터를 조작해도 함수를 벗어나면 값은 그대로기 때문에 전혀 영향이 없다.
- 장점 : 값을 복사해서 사용하기 때문에 원래 값이 보존되어 안전하다.
- 단점 : 값을 복사해서 메모리에 할당하기 때문에 메모리의 사용량이 늘어난다.
#include <stdio.h>
// a와 b를 선언해서 swap함수에 인자를 보낸 후 출력
int main() {
int a = 10;
int b = 20;
swap(a, b);
printf("%d %d ", a, b);
}
// a와 b를 매개변수 dum1과 dum2에 받아 temp를 선언해서 값을 교환해준다.
void swap(int dum1, int dum2) {
int temp = dum1;
dum1 = dum2;
dum2 = temp;
}
// 결과 :
// 이미 함수에 복사된 값을 집어넣었기 때문에 main함수 내부의 기존 값에는 변함이 없다.
콜바이래퍼런스(Call By Reference)
- 다른 함수를 호출할 때 넘기는 값이 변수의 주소값 자체를 참조하기 때문에 함수 내에서 데이터를 조작하면 함수를 벗어나도 값은 변경되기 때문에 영향이 있다.
- 장점
- 함수에 큰 크기의 데이터를 전달할 때, 데이터를 복사하지 않고 원래의 데이터에 참조하기 때문에 메모리가 효율적이다.
- 함수 내에서 직접 원래의 데이터를 수정할 수 있기 때문에 여러 개의 값을 반환할 수 있다.
- 단점
- 원래의 데이터에 직접 참조해서 수정이 가능하기 때문에 보안이 취약할 수 있다.
- 참조하려는 값이 NULL인 경우 NULL 참조 오류가 발생할 수 있다.
- 장점
#include <stdio.h>
// a와 b를 선언해서 swap함수에 a와 b의 주소값을 보낸 후 출력
int main() {
int a = 10;
int b = 20;
swap(&a, &b);
printf("%d %d ", a, b);
}
// a와 b의 주소값을 포인터dum1, 포인터dum2로 받아 고유 값 a와 b를 교체
void swap(int *dum1, int *dum2) {
int temp = *dum1;
*dum1 = *dum2;
*dum2 = temp;
}
// 결과 :
// 함수에 주소값을 참조하여 가져왔기 때문에 main함수 내부의 값이 바뀌었다.
학습 시간 : 10 ~ 25시
728x90
'크래프톤 정글 > TIL' 카테고리의 다른 글
크래프톤 정글 week04, day28 - 배열과 포인터의 관계, 균형 이진 탐색 트리 (1) | 2024.02.20 |
---|---|
크래프톤 정글 week04, day27 - RB트리 개념 (1) | 2024.02.20 |
크래프톤 정글 week04, day25 - c언어 포인터, 배열 (1) | 2024.02.20 |
크래프톤 정글 week03, day24 - 알고리즘 문제 (1) | 2024.02.20 |
크래프톤 정글 week03, day23 - 퀴즈 복습, 알고리즘 문제 (1) | 2024.02.20 |