Publish:

태그: , , ,

카테고리:


🤯 언리얼을 하기 위해 C++ 기억 되살리기 프로젝트

새로운 키워드 (C++11~) / nullptr, enum class

  • nullptr (널 포인터)
  • 고정 폭 정수형
  • enum class

1. nullptr

  • NULL 을 쓰면 가끔 이상한 문제가 발생함
1
2
3
4
5
6
7
8
// Class.h
float GetScore(const char* name);
float GetScore(int id);

// Main.cpp
Class* myClass = new Class("COMP3100");
// ...
int score = myClass->GetScore(NULL);            // <- 어떤 함수가 호출될까?

char* 포인터로 받는 함수가 호출될 것이라고 생각할 수 있지만, int형을 받는 함수가 호출된다.

1
2
3
4
5
int number = NULL;                              // OK
int* ptr = NULL;                                // OK

int anotherNumber = nullptr;                    // ERROR;
int* anotherPtr = nullptr;                      // OK
  • NULL
    • #define NULL 0
    • 숫자임;
  • nullptr
    • typedef decltype(nullptr) nullptr_t;
    • null 포인터 상수
    • 포인터에는 언제나 nullptr을 쓰자

2. 고정 폭 정수형

int가 4바이트라는 표준은 사실 없음.
많이 쓰는 플랫폼에서 4바이트일 뿐이고, 보장은 없음.
그래서 고정 폭 정수형이 등장함.

  • int8_t / uint8_t : 8비트 int 부호 있는거/없는거
  • int16_t / uint16_t
  • int32_t / uint32_t
  • int64_t / uint64_t
  • intptr_t / uintptr_t
  • 등등..
    • 가독성 향상을 위해 낡은 기존 자료형보다 이것들을 활용하자~
    • int8_t score = student->GetScore();

3. enum class

  • 문제점 : C스타일 enum
    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
    
    // Main.cpp
    enum eScoreType
    {
      Assignment1,
      Assignment2,
      Assignment3,
      Midterm,
      Count,
    };
    
    enum eStudyType
    {
      Fulltime,
      PartTime,
    };
    
    // Main.cpp
    int main()
    {
      eScoreType type = Midterm;
      eStudyType studyType = FullTime;
    
      int num = Assignment3;                              // 문제 발생!
    
      if (type == FullTime)                               // 문제 발생!
      {
          // ...
      }
    
      return 0;
    }
    

컴파일러가 타입 체크를 해주지 않는다는 단점이 있었음!

  • 해결책 : enum class
    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
    
    // Main.cpp
    enum class eScoreType
    {
      Assignment1,
      Assignment2,
      Assignment3,
      Midterm,
      Count,
    };
    
    enum class eStudyType
    {
      Fulltime,
      PartTime,
    };
    
    // Main.cpp
    int main()
    {
      eScoreType type = eScoreType::Midterm;
      eStudyType studyType = eStudyType::FullTime;
    
      int num = eScoreType::Assignment3;                              // 에러 출력함
    
      if (score == eStudyType::FullTime)                              // 에러 출력함
      {
          // ...
      }
    
      return 0;
    }
    

컴파일 에러 출력을 해주므로 실수를 잡을 수 있다.

  • 정수형으로의 암시적 캐스팅이 없음
  • 자료형 검사(타입체크) 해준다
  • 또한 enum에 할당할 바이트 양을 정할 수도 있음
    • 파일 저장할 때 유용…
1
2
3
4
5
6
7
8
9
10
#include <cstdint>
enum class eScoreType : uint8_t         // 8비트 int에 집어넣겠다는 명시
{
    Assignment1,
    Assignment2,
    Assignment3,
    Midterm,
    Final = 0x100,          // 경고 발생
                            // 0x100은 256인데 8비트에 할당할 수 없어...
};

이슈 및 공부한 것을 기록해두는 개인 블로그 입니다. 댓글, 피드백 환영합니다 🙂

Update:

댓글남기기