새로운 키워드 (C++11~) / nullptr, enum class
태그: C++, Cpp, enum class, nullptr
카테고리: Cpp
🤯 언리얼을 하기 위해 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비트에 할당할 수 없어...
};
댓글남기기