멈추지 않고 끈질기게

[C++][메모] 옛날 문법 정리 본문

C++

[C++][메모] 옛날 문법 정리

sam0308 2024. 11. 3. 09:49

※ 해당 포스팅은 개인의 공부 정리용 글입니다. 틀린 내용이 있다면 추후 수정될 수 있습니다.

※ 해당 포스팅은 하기 출처들을 참조하였습니다.

- https://stackoverflow.com/questions/6420526/what-is-the-difference-between-bool-and-bool

 

What is the difference between BOOL and bool?

In VC++ we have the data type “BOOL” which can assume the value TRUE or FALSE, and we have the data type “bool”, which can assume the value true or false. What is the difference between them and w...

stackoverflow.com

- https://blog.naver.com/ljy9378/221515469583

 

C++에서 nullptr을 사용해야 하는 이유

C, C++에서 NULL은 포인터 값을 초기화하기 위한 상수로 주로 사용된다. C++ 11에 추가된 nullptr과...

blog.naver.com

 

 

 

 

1. BOOL vs bool

 - BOOL은 windef.h에 선언된 typedef이며, 실제 자료형은 int(4바이트)

 - 같이 사용되는 TRUE, FALSE도 마찬가지로 매크로이며, 단순히 1과 0을 의미함

사진 1. TRUE와 FALSE

 

 - 이유는 기존의 C언어에 boolean 자료형이 없었기 때문에, int형으로 대체하되 매크로로 명시한 것 

 - 실제 자료형이 int이기 때문에 0과 1 외의 값도 넣을 수 있으며, 여러모로 boolean보다 불안정

사진 2. BOOL 타입의 문제점

 

 - 다만 기존에 작성된 코드에서 많이 보이기 때문에, 차이점만 숙지하면 될 듯

 

 

2. NULL vs nullptr

 - NULL도 마찬가지로 vcruntime.h에 작성된 매크로로, 단순히 0을 의미함

 - 보통 nullptr과 비슷한 용도로 사용되지만, 값이 정수형이다 보니 int 등의 자료형으로 받는 것도 가능함

#include <iostream>

int main()
{
    int* ptrTest = NULL;

    int nTest{};
    if (nTest == NULL)
        std::cout << "int값이 NULL 입니다.\n";
}

사진 3. NULL의 문제점

 

 - nullptr의 경우 nullptr_t라는 별도의 구조체로, 포인터 외의 변수와 할당, 비교 등의 동작은 컴파일 오류를 발생시킴

 - BOOL과 마찬가지로 포인터가 유효한지를 검사하는 데에는 nullptr이 더 안전하나,
   기존 코드에서 많이 사용되긴 하니 일단 차이점만 숙지하자

 

 

3. enum vs enum class

 - 둘 다 열거형을 표현하는 키워드로, C++ 11에서 enum class가 추가 도입됨

 - 기존의 enum은 내부 변수들이 전역형(구조체와 비슷)

   ex) COLOR라는 열거형 안에 RED라는 값이 있다면, 다른 곳에서 그냥 RED로 사용할 수 있음

 - enum class의 경우 이름에 맞게 클래스처럼 내부 값들을 캡슐화함

  ex) COLOR라는 열거형 안에 BLUE라는 값이 있다면, COLOR::BLUE로 사용해야함 

#include <iostream>

enum COLOR
{
    RED = 10
};

enum class COLOR_C {
    BLUE = 20
};

int main()
{
    // 그냥 RED로 사용 가능
    std::cout << "RED의 값은 " << RED << " 입니다.\n";
    // 그냥 BLUE로 작성 시 컴파일 에러
    std::cout << "BLUE의 값은 " << (int)COLOR_C::BLUE << " 입니다.\n";
}

사진 4. enum vs enum class

 

 - enum의 변수는 바로 정수형 변수로 받아 사용 가능

  ex) int nTest = RED;

 - enum class의 값은 해당 enum class 타입으로만 받을 수 있음(물론 변환은 가능)

  ex) int nTest = COLOR_C::BLUE; // 컴파일 에러 

#include <iostream>

enum COLOR
{
    RED = 10
};

enum class COLOR_C {
    BLUE = 20
};

int main()
{
    int nTest_1 = RED;
    COLOR colorTest_1 = RED;

    int nTest_2 = COLOR_C::BLUE; // 컴파일 에러
    COLOR_C colorTest_2 = COLOR_C::BLUE;
    int nTest_3 = static_cast<int>(COLOR_C::BLUE);

}

 

 - 또한 enum class는 캡슐화하기 때문에 같은 밸류 이름이 겹쳐도 괜찮지만,
   enum의 경우 같은 이름이 겹치면 빌드 시 에러가 발생함

 - 현재는 enum class가 좀 더 권장되는 느낌으로 보이나,

   이전 코드에서 많이 사용되기도 했으니 차이점만 인지하고 가자