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

열거형 : 상수에 이름을 부여해주는 기능이다.

  • 열거형은 사용자정의 변수 타입으로도 사용이 가능하다.
  • 열거형의 이름은 사용자정의 변수 타입이 된다.
  • 열거형 안의 목록은 상수가 된다.
  • 열거형 안의 목록은 기본으로 0부터 1씩 차례로 증가하게 된다.
  • 열거형 안의 목록은 원한다면 기본 값을 변경할 수도 있다.
  • 기본 4바이트로 생성된다.
1
2
3
4
5
6
7
8
9
10
namespace SRP
{
	// char 형으로 지정하여 enum의 크기 조절
	enum E_SRP : char
	{
		Scissor = 1,
		Rock,
		Paper
	};
}

기존 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;
}

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

  • 정수형으로의 암시적 캐스팅이 없음
  • 자료형 검사(타입체크) 해준다
  • 값이 아닌 타입이 지정되는 것이므로 (E_SRP 타입이 되는 것), 다른 변수에게 정수값으로 대입되지 않는다.

  • 또한 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:

댓글남기기