[C++] 모던 C++(C++11) 기초
2023. 5. 9. 16:14ㆍC++
1. auto 키워드 : 타입을 추론(type deduction)하는 역할을 한다.
- 기본 auto는 const, &(참조) 를 무시하기때문에 조심해야한다.
- 가독성이 나빠지기 때문에, 타이핑이 지나치게 길어지는 경우에만 사용한다.
2. 중괄호 초기화
- stl vector와 같은 Container에서 유용하게 사용할 수 있다.
- 축소 변환을 방지한다. (int > double 불가능)
- 만든 클래스에서 중괄호 초기화를 통한 생성자를 받아주고 싶다면, initialize_list를 인자로 하는 생성자를 정의해야 한다. 이 때, 다른 생성자보다 initialize_list 생성자가 우선순위가 더 높으므로, 다른 생성자가 무시될 수 있다. (주의!)
3. nullptr
- 그저 0의 의미를 갖는 NULL과 다르게, nullptr은 포인터의 값만을 의미한다. > 가독성을 높이고 오동작을 방지한다.
4. using : typedef와 비슷한 역할을 한다.
- typedef보다 직관적이다. ex) typedef void(*MyFunc)(); / using MyFunc = void(*)();
- template을 지원한다.
5. enum class : enum의 이름 공간 소비를 방지
- 클래스로 이름 공간을 관리하여, 해당 enum class를 통해서만 enum의 값들을 접근할 수 있다.
- enum과 다르게 암묵적인 변환을 금지한다.
6. delete (함수 삭제) : 함수를 삭제하고 싶을 때 사용한다. (복사 생성 방지 등)
7. override: 상위 클래스의 함수를 오버라이드하고 있다는 것을 나타낸다.
- 가독성, 실수 방지를 위해 사용한다. 재정의 시 override 키워드를 붙여주는 것이 좋다.
8. final: 하위 클래스에게 해당 함수를 오버라이드하는 것을 허용하지 않는다.
9. 오른값 참조 : 오른값(r-value)만 참조할 수 있는 참조 타입(&&)으로 오른값을 참조
- 왼값(l-value)이란, 단일식을 넘어서 계속 지속되는 개체를 의미한다. 오른값(r-value)이란, 왼값이 아닌 나머지를 의미한다. (임시값, 람다 등등..)
- r-value의 불필요한 복사를 방지하고 소유권을 이동시키는 개념.
- 오른값 참조로 인자를 받는 생성자를 이동 생성자라고 하고, 불필요한 복사대신 이동(move)이 발생한다.
10. 전달 참조(forwarding reference): 왼값 참조, 오른값 참조를 동시에 한다.
- forward 키워드를 사용한다.
11. 람다 : 함수 객체를 빠르게 만드는 문법이다. <문법: ['캡처']('인자'){'내용'} >
- closure(클로저) : 런타임에 람다에 의해 만들어진 객체를 뜻한다.
- capture(캡처) : 함수 객체(Functor) 내부에 변수를 저장하는 개념과 유사하다. 기본 캡처 모드 혹은 변수마다 캡처 모드를 지정한다.
- 기본 캡처 모드: 값(복사) 방식은 [=], 참조 방식은 [&]로 작성한다. 모든 변수의 캡처 모드를 지정한다.
- 변수 마다 캡처 모드 지정: 기본 캡처 모드보다는 변수마다 캡처 모드를 따로 지정하는 것이 좋다. (가독성 때문) 값 방식은 따로 붙이지 않고, 참조 방식은 앞에&를 붙이면 된다. ex) [var1, &var2] : var1은 값 방식, var2는 참조 방식
12. 스마트 포인터 : 포인터보다 안전한 사용을 위해, 포인터를 정책에 따라 관리하는 객체 (포인터를 Wrappping함)
- shared_ptr, weak_ptr, unique_ptr의 세가지 형택의 스마트 포인터가 존재한다. 각각 다른 정책을 가짐.
- shared_ptr: 포인터를 참조하는 객체가 생길 때마다 참조 카운트(ref count)를 1씩 증가시키고, 해당 객체가 소멸될 때 참조 카운트를 1씩 감소시킨다. 이 때 참조 카운트가 0이 되면 실제 포인터가 가리키는 객체를 할당 해제한다.
- shared_ptr을 사용할 때, 두 shared_ptr을 지닌 객체가 서로를 멤버로 소유하고 있을 경우, 순환 구조에서의 문제가 발생할 수 있다. (둘 다 삭제가 안되는..)
- weak_ptr: shared_ptr과 다르게 객체 생명 주기에 관여하지 않는다. .expired()를 통해 해당 포인터가 해제 됐는지 확인할 수 있고, .lock()을 통해 shared_ptr로 변환할 수 있다.
- unique_ptr: 해당 변수만 포인터에 접근할 수 있게 한다. 복사가 불가하고, 이동(std::move)으로 옮길 수만 있다.
'C++' 카테고리의 다른 글
[C/C++] 라이브러리 (0) | 2023.05.10 |
---|---|
[C&C++] const 키워드 (0) | 2023.04.25 |
[C/C++] 소켓 API (0) | 2023.04.06 |
[C++] 템플릿 (0) | 2022.01.07 |
[C++] 형 변환 연산 (0) | 2022.01.07 |