경일 메타버스 20220613 ~ 20220614 11주차 1일 ~ 2일 수업내용. 0610 레벨 테스트 해설
https://github.com/strange-tiger/Metaverse_01_LevelTest.git
3- 함정문제. 4bit 숫자임을 간과하여 오버플로우를 생각하지 못했다. 따라서 순진하게도 * 2를 반복했을 뿐이다.
8- NULL 포인터에 대한 이해가 부족했다. NULL 포인터는 그 값이 없음을 의미할 뿐만 아니라, 그 주소값이 0x00000000처럼 0을 갖는 특수한 포인터임을 기억해야 한다.
9- 배열 포인터에 대한 이해가 부족했다. 각 배열의 포인터이므로, int arr2[4][5]에 대하여 arr2 또한 배열 포인터라 볼 수 있다. parr = arr2는 int[5]의 요소 4개를 가진 배열이 parr에 할당되었다고도 볼 수 있다고 생각되어진다.
2022 / 06 / 14 구현 8번 : 달팽이 배열
> 2차원 동적 할당의 문제
cout << "배열의 크기를 입력하세요 : ";
int size;
cin >> size;
int** arr = new int* [size];
for (int i = 0; i < size; ++i)
{
arr[i] = new int[size];
}
// 위의 할당법에는 문제가 있다. -> 일반적인 2차원 배열은 연속적이지만,
// 이 할당은 연속적으로 할당 되지 않는다.
//
// 문제점
//
// 1. 반환의 불편함
for (int i = 0; i < size; ++i)
{
delete[] arr[i];
}
delete[] arr;
// 2. 중요 : 메모리의 파편화
// => 데이터 사이에 빈 공간이 생기고, 그 사이의 공간은 연속적이지 않기에 할당이 어려워진다.
//
// 그렇기에 되도록 1차원 배열로 동적 할당한다.
int* arr = new int[size * size]
Lookup Table (LUT, 순람표)
배열의 인덱스를 사용해 switch문과 같은 효과를 낼 수 있다.
주어진 연산에 대해 미리 계산된 결과들의 집합(배열)
런타임 계산을 더 단순한 배열 색인화 과정으로 대체하는 데 자주 쓰인다. 처리 시간의 절약
'Key-Value' 구조
코드의 모듈화
할당은 했는데 해제를 안했다. => 메모리 누수 (Memory Leak)
이미 해제한 메모리에 대해서 또 해제했다. => 이중 해제 (Double Free)
너무 빨리 해제했다. => 조기 해제, 조숙한 해제, 너무 급한 해제 (Premature Free)
min / max 함수 활용
// clamp 구현
// digitCount : [1, 100]
// #define MAX_DIGIT_COUNT 100
digitCount = std::max(1, std::min(digitCount, MAX_DIGIT_COUNT));
// 이 식이 digitCount를 저 범위 안에 고정할 수 있는 이유는 다음 3가지 경우를 생각하면 된다.
// 1. digitCount가 최솟값(1) 보다 작을 때
// ex) digitCount = 0;
// std::max(1, std::min(0, 100)) == std::max(1, 0) == 1;
// 2. digitCount가 최댓값(100) 보다 클 때
// ex) digitCount = 101;
// std::max(1, std::min(101, 100)) == std::max(1, 100) == 100;
// 3. digitCount가 최솟값과 최댓값 사이에 있을 때
// ex) digitCount = 11;
// std::max(1, std::min(11, 100)) == std::max(1, 11) == 11;