프로그래머 56

cpp Modern C++ delete

delete ( 삭제된 함수 ) 특정 함수를 사용하고 싶지 않을 때 이용한다. 컴파일러가 기본적으로 제공하는 함수도 포함한다. class Player { public: void operator=(const Knight& k) = delete; private: // delete가 없었을 때 특정 함수를 막는법 // 정의되지 않은 비공개 함수 void operator=(const Knight& k); // 복사 연산자 막기 } 출처 https://www.inflearn.com/course/%EC%96%B8%EB%A6%AC%EC%96%BC-3d-mmorpg-1/dashboard [C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문 - 인프런 | 강의 시리즈를 원활하게 ..

cpp Modern C++ enum class

enum 살펴보기 enum PlayerType { PT_Knight, PT_Archar, PT_Mage }; enum MonsterType : char { MT_Slime = 5, MT_Skeleton }; 첫 번째 원소의 기본값은 0이다. 다음 원소로 갈 수록 1씩 증가한다. enum은 기본적으로 int형이다. enum의 원소들의 이름이 { } 영역 내에서만 동작하는 것이 아니라 전역으로 퍼질 수 있다. 따라서 unscoped enum이라 부른다. 각 원소를 사용할 때 int형으로 인식한다. enum class enum과 달리 scoped enum이다. { } 영역 내에서만 변수 이름이 활동한다. 사용하는 이유는 간단하다. 이름공간 관리에 이점이 있다. 암묵적인 타입 변환이 금지된다 여기서 2번은 상황..

cpp Modern C++ using

using typedef을 확장한 것이다. typedef을 사용한 이유 자료형의 이름이 너무 길 때 자료형이 정확히 정해지지 않았을 때 // 1 typedef vector::iterator Vecit; // 2 typedef int id; // 나중에 __int64, unsigned int 등 변할 여지가 있다. using을 사용하는 이유 typedef을 사용하는 이유 typedef보다 직관성이 뛰어나다 typedef은 템플릿을 이용할 수 없다. // 2 using ID = int; typedef void (*MyFunc)(); using MyFunc = void(*)(); // 3 template using List = std::list; // typedef가 템플릿을 이용하려면 2단계를 거친다. te..

cpp Modern C++ 중괄호 초기화

중괄호{ } 초기화 초기화 방식을 통일 시키고 축소 변환을 방지하는데 의미를 둔다. 여러가지 초기화 방식을 살펴보자. class MakeClass { public: }; int a = 0; int b(0); int c{ 0 };// 중괄호 초기화 MakeClass mc; MakeClass mc2 = mc;// 복사 생성자 MakeClass mc3{ mc2 }; 중괄호 초기화는 컨테이너와 잘 어울린다. // vector 기존 초기화 방법 vector v1; v1.push_back(1); v1.push_back(2); vector v2(3, 1); // 중괄호 초기화 vector v3{ 1, 2, 3, 4 }; 배열 초기화 방식처럼 벡터를 초기화 할 수 있다. 축소 변환 방지는 데이터 유실을 방지하는 것이다..

cpp Modern C++ auto

auto type deduction(타입 추론) 해준다. 값을 보고 type을 추론한다. 추론 규칙은 복잡하기 때문에 중급자 이상일 때 알아보는걸 추천한다. int i = 3; float f = 3.14f; double d = 45.32; MakeClass mc = MakeClass(); const char* word = "hello"; auto i = 3; auto f = 3.14f; auto d = 45.32; auto mc = MakeClass(); auto word = "hello"; auto를 사용할 때 주의할 점은 const와 &을 무시한다는 점이다. int a = 3; int& ref = a; const int cst = a; auto test1 = ref;// auto -> int auto..

cpp algorithm 라이브러리

#include 알고리즘을 이용하면 코드의 가독성이 좋아진다. 왜냐하면 cpp을 사용하는 사람들이 자주 사용하는 기능을 담고 있기 때문이다. 똑같은 기능을 구현할 때, 알고리즘을 사용한 코드는 다른 사람들이 어떤 기능인지 빠르게 파악할 수 있다. 하지만 개인이 직접 구현한 코드는 사람마다 해당 코드가 어떤 기능을 하는지 파악하는 시간이 다르다. 수많은 알고리즘 중에서 자주 사용하는 알고리즘을 알아보자. // 기본코드 srand(static_cast(time(nullptr))); vector v; for (int i = 0; i < 100; i++) { int num = rand() % 100; v.push_back(num); } find(), find_if() 특정 숫자가 벡터에 있는지 체크하는 기능을 ..

cpp STL 기타 연관 컨테이너

set key만 저장한다는 것을 제외하면 map과 유사한 방식으로 사용한다. #include set s; s.insert(10); s.insert(30); s.insert(20); s.insert(40); s.erase(40); s[4] = 50;// 지원하지 않는다. multimap, multiset 중복 key를 허용한다. 중복 key를 사용할 일이 거의 없기 때문에 잘 사용하지 않는다. multimap mm; multiset ms; mm.insert(make_pair(1, 100)); mm.insert(make_pair(1, 200)); mm.insert(make_pair(2, 300)); mm.erase(1);// key=1은 전부 삭제 mm[1] = 500;// 지원하지 않는다. // ms와 사..

cpp STL MAP

map STL의 연관 컨테이너 중 하나다. 시퀀스 컨테이너(vector, list, deque)의 치명적인 단점은 원하는 조건에 해당하는 데이터를 빠르게 찾을 수 없다는 점이다. 이러한 문제점을 해결하기 위해 연관 컨테이너인 map을 이용할 수 있다. map은 균형 이진 트리( AVL )로 구성된다. 일단 노드 기반인 것만 알아도 된다. // map의 노드 구조 class Node { public: Node* _left; Node* _right; // DATA int _key; int _value; // 또는 pair _data } 노드를 보면 알 수 있듯이 map은 key와 value로 구성된다. map m;// (key, value) map의 데이터 삽입과 삭제 for (int i = 0; i < 1..

cpp STL deque

deque(double-ended queue) 양방향 큐라는 deque는 vector와 유사하다. vector의 메모리 할당 정책은 기존 메모리 영역이 가득찬다면, 기존 메모리에 들어있던 데이터를 복사한 뒤에 기존 영역을 삭제한다. 그리고 기존 메모리 영역보다 더 큰 새로운 메모리 영역을 생성한다. 여기에 복사한 데이터를 붙여넣는다. deque는 새로운 메모리 영역을 만든 후 해당 메모리에 데이터를 넣는다. 이때 새로운 메모리 영역은 기존 메모리 영역과 용량이 같다. 새로운 메모리 영역과 기존 메모리 영역이 list처럼 연결되어 있지 않다. 특정 테이블에서 각 메모리 위치를 관리한다. 아파트 주소를 생각하면 된다. 코드 아파트(테이블) 1동[..., 1013,...] 2동[..., 2013,...] 3동..