경일게임아카데미 멀티 디바이스 메타버스 플랫폼 개발자 양성과정 20220613~14 2022/04/04~2022/12/13

Jinho Lee·2022년 6월 13일
0

경일 메타버스 20220613 ~ 20220614 11주차 1일 ~ 2일 수업내용. 0610 레벨 테스트 해설

레벨 테스트

이론

2022. 06. 10 레벨 테스트 이론

구현

https://github.com/strange-tiger/Metaverse_01_LevelTest.git

레벨 테스트 해설

이론

  1. B
  2. 1111
  3. 오답 : 4bit 숫자 : A. 14, B. 12, C. 8
  4. F → E → A → D → C → B
  5. A. 문법 오류 B. 실행 시간에 오류 발생 C. 문제 해결 절차를 잘못 기술함
  6. aP : pointer to int, aP의 초기값이 없다 ⇒ aP는 아무것도 간접 참조하고 있지 않다.
    초기화 되어있지 않은 포인터를 통해 값을 바꾸려고 하고 있다.
  7. a의 타입이 const로 수식되어 있는데, a = 20으로 값을 바꾸려고 시도하고 있다. 따라서 컴파일 오류가 발생한다.
  8. 오답 : p가 널 포인터이므로 진리값이 거짓으로 평가되어 B가 실행된다. 널 포인터에 대한 이해가 필요. NULL 포인터 → 0x00000000 : 주소값 0.
  9. 오답 : int (*parr)[5]; 배열 포인터에 대한 이해 필요.
  10. 3
  11. seonmun.BestFriend; (&seonmun)->BestFriend;

오답노트

3- 함정문제. 4bit 숫자임을 간과하여 오버플로우를 생각하지 못했다. 따라서 순진하게도 * 2를 반복했을 뿐이다.

8- NULL 포인터에 대한 이해가 부족했다. NULL 포인터는 그 값이 없음을 의미할 뿐만 아니라, 그 주소값이 0x00000000처럼 0을 갖는 특수한 포인터임을 기억해야 한다.

9- 배열 포인터에 대한 이해가 부족했다. 각 배열의 포인터이므로, int arr2[4][5]에 대하여 arr2 또한 배열 포인터라 볼 수 있다. parr = arr2는 int[5]의 요소 4개를 가진 배열이 parr에 할당되었다고도 볼 수 있다고 생각되어진다.

구현

  1. 정렬 : 버블 정렬.
    • 거품이 수면으로 올라가듯이 정렬된다 하여 버블 정렬이라 불린다.
    • 버블 정렬은 한 사이클을 돌 때마다 가장 마지막 원소가 정렬된다.
  2. 2022 / 06 / 13 구현 5번 : 로또 번호 생성기
  1. 2022 / 06 / 13 구현 6번 : 카드 배분
  1. 2022 / 06 / 13 구현 7번 : 빙고
  1. 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]
  • 2022. 06. 14 구현 8번 답 : 달팽이 배열

    • Lookup Table (LUT, 순람표)
      배열의 인덱스를 사용해 switch문과 같은 효과를 낼 수 있다.

      • 주어진 연산에 대해 미리 계산된 결과들의 집합(배열)

      • 런타임 계산을 더 단순한 배열 색인화 과정으로 대체하는 데 자주 쓰인다. 처리 시간의 절약

      • 'Key-Value' 구조

  • 코드의 모듈화

    • 동적 할당의 문제점. 즉, 메모리를 수동으로 관리할 때의 문제점.
      1. 할당은 했는데 해제를 안했다. => 메모리 누수 (Memory Leak)

      2. 이미 해제한 메모리에 대해서 또 해제했다. => 이중 해제 (Double Free)

        • 이미 해제한 메모리를 가리키는 포인터 => 댕글링 포인터 (Dangling Pointer)
      3. 너무 빨리 해제했다. => 조기 해제, 조숙한 해제, 너무 급한 해제 (Premature Free)

    • Clamp 함수
      • 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;

0개의 댓글