[C++] 모던 C++(C++11) 기초

2023. 5. 9. 16:14C&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/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