본문 바로가기

분류 전체보기

(308)
[C++] enum vs enum class 기존 enum은 unscoped, 범위가 없다. 그 의미는 내가 PlayerType enum에 Knight를 사용했다면, MonsterType 에서는 Knight를 사용할 수 없다. 하지만 enum class는 scoped, 범위가 있고 범위는 enum class 안으로 제한된다. 그래서 PlayerType, MonsterType 두 enum class에 모두 Knight를사용할 수 있다. 그런데 enum class는 또 하나, 암묵적인 변환이 불가능하다. double value = KNIGHT; // enum 암시적 변환 허용 double value = static_cast(PlayerType::Knight); //명시적 변환만이 허용되며 앞에 enum class::을 표기해야 함 //그 이유는 enu..
[C++] typedef보다 using을 사용하자. Modern C++의 using은 typedef의 완벽한 상위호환인데, 왜 그런지 살펴보자. typedef void(*MyFunc)(); using MyFunc = Void(*)(); 우선 가독성이 좋다. 위는 매개변수를 받지 않고 void형의 함수 포인터를 선언한 것인데, typedef는 함수타입 사이에 함수명이 껴서 굉장히 불편하다. 하지만 using은 함수명과 타입을 완전히 분리시켜 보기 편하다. 이것은 제쳐두고라도 using을 사용하기 좋은 상황은 템플릿을 사용할 때이다. template struct Vector { typedef std::vector type; } template using Vector = std::vector; typedef는 템플릿을 지원하지 않기 때문에 위처럼 구조체를 만들..
[C++] NULL은 int고 nullptr은 포인터다. 아무것도 없다는 것을 표현하고 싶을 때 NULL과 nullptr 두 방식으로 표현할 수 있다. 두 방식의 큰 차이점은 NULL은 0과 같기 때문에 int이고 nullptr은 포인터이다. 그래서 포인터가 아무것도 가리키지 않다는 것을 표현할 때는 NULL이 아니라 nullptr이 적합하다. Test(NULL); //Test(int) 생성자 실행 TEST(nullptr)//Test(void*) 생성자 실행 nullptr의 작동원리는 *연산자를 오버로딩해 0을 반환하는 것이다. 그래서 결론적으로 nullptr도 0을 반환하지만 *가 붙어있는 포인터를 대상으로만 작동한다.
[C++] auto auto는 C++11에서 생긴 편리한 문법인데, 변수 선언시에 따로 데이터 타입 설정 없이 auto라고만 하면 초기화 하는 값에 따라 알아서 타입을 맞춰준다. auto a1 = 3; //int auto a2 = 2.3f; //float auto a3 = 2.3; // double; auto a4 = Knight(); //Knight; auto a5 = "ASDF"; //const char* auto에 *을 붙일 시 초기화 값이 포인터일 경우에만 작동한다. auto* p1 = "ABCD"; //const char* auto* i1 = 3; // (x) 주의해야 할점은 auto는 const, &를 무시한다는 것이다. int& ref = a; const int cst = a; auto b1 = ref;//in..
[C++] algorithm 헤더의 remove, remove_if 주의점 map의 remove 함수와 달리 algorithm 헤더의 remove,remove_if는 완전히 데이터를 지우지 않는다. 따지자면 데이터를 지우는 것이 아닌 조건에 맞지 않는 데이터만 남긴다는 느낌이다. 게다가 데이터를 남기고 나머지 데이터는 지우는 것이 아니라 그대로 남긴다. 그래서 데이터를 목적에 맞게 제거하기 위해 erase와 연계한다. Vector v; v.push_back(1); v.push_back(4); v.push_back(3); v.push_back(5); v.push_back(8); v.push_back(2); std::remove_if(v.begin(),v.end(),IsOdd()); 위와 같이 벡터에 데이터를 집어 넣고 IsOdd라는 함수객체에 따라 데이터를 제거한다고 하자. 원래..
[알고리즘] 벡터와 메모리 벡터는 어떻게 배열을 유동적인 크기로 사용할까? 정답은 여유분을 두고 메모리를 할당하고 메모리가 부족하면 증설하기 때문이다. 벡터의 크기는 실제 요소의 개수와 같지 않은데 실제 요소의 개수를 size 여유분을 포함한 용량을 capacity라고 한다. 벡터에 요소를 한개씩 추가하는 것을 반복하면 size는 1씩 오르지만 capacity는 1,2,3,4,6,9,13,19,28,42 약 1.5배씩 오른다. 왜 그렇게 오르냐면 벡터가 용량을 늘릴 때 마다 기존 영역에서 늘리는 것이 아니라 (다른 사용 중 메모리 침범 가능성) 용량을 늘린 만큼 비어있는 메모리를 찾아 그곳에 기존 벡터 내용을 복사하기 때문이다. 이렇게 용량을 증설할 때마다 데이터를 복사하는 것이 부담스러운 작업일 수 있어 reserve로 미리 용..
[C++] 값 타입 변환 vs 참조 타입 변환 비트열 재구성 여부 1.값 타입 변환 의미를 유지하기 위해 원본과 다른 비트열 구성 int a = 123456789; float b = (float)a; b는 정수형 a와 유사한 값의 의미를 가지지만 비트단계에서는 완전히 다른 비트열을 가지게됨 2.참조 타입 변환 비트열을 재구성하지 않고 관점만 바꾼다. (포인터 타입 변환도 동일한 룰을 따름) int a = 123456789; float b = (float&)a; b는 a와 같은 비트열을 가지지만 의미에서는 전혀 다른 값을 가지게 된다. 연관 없는 클래스 사이 변환 1.값 타입 변환 일반적으로는 안되고 타입 변환 생성자나 타입 변환 연산자가 있어야 함 Knight knight; Dog dog = (Dog)knight; // 타입 변환 생성자 Knight..
[C++] new vs malloc 편의성 -> new 승 (사이즈가 클래스 타입에 자동으로 맞춰짐) 할당 크기를 정해줘야 할 경우 -> malloc 승 new의 특수효과: 생성 타입이 클래스일 경우 new 할 때 생성자, delete 할 때 소멸자를 호출한다.