1) 형식 연역, 열거형, 수학 상수, 널 포인터 , 2진수 표현
- auto: 형식 연역을 할 수 있는 형식 지정자, 변수 선언과 초기화시 사용
=> auto로 선언한 변수에 초기화되는 데이터를 통해서 형식을 연역
= 데이터 형식을 자동으로 추론
- auto변수는 반드시 선언과 함께 초기화 되어야 한다
- 함수에서 매개변수의 형식 지정자로 사용할 수 없다
- 구조체나 클래스의 멤버 변수로 사용할 수 없다
- auto변수를 반환하는 함수는 decltype을 사용해야 한다
=> auto를 사용하면 편하긴 하지만 데이터 형식을 알아서 지정해주는 만큼 컴파일시 많은 연산이 필요하고, 성능이 저하될 수 있음
- decltype: 형식 추출 함수 (형식 연역 가능)
변수 선언, 함수/ 클래스 템플릿에서 반환값의 형식을 연역할 때 사용
반환값의 형식을 연역할 때는 선언문 앞쪽이 아닌 뒤쪽에 표기
= 후행 반환 형식 (반환값의 형식을 나타내는 자리에 auto만 사용하면 오류 발생, 반드시 후행 반환 형식으로 decltype 지정해야 함)template <typename T, typename TT> auto mix_template (T t, TT tt) -> decltype(t+u) { return t*tt; }decltype은 auto와 다르게 복잡한 표현식에서 형식을 연역할 수 있고, 레퍼런스나 상수도 정확하게 추론할 수 있음
- enum: (범위 지정) 열거형
열거형: 분류나 특성을 나타내는 값을 표현할 때 사용
범위 지정 열거형: 선언된 범위를 반드시 지정해 주어야 함
-> enum 키워드 뒤에 class/ struct를 사용하면 범위 지정 열거형,
사용하지 않으면 범위 미정 열거형enum class monster_enum : char {monster_a_type, monster_b_type='b', monster_c_type='c'}; // 범위 지정 열거형 선언('값 없음', 'b", 'c'로 초기화)enum struct terrain_enum {forest_terrain_type, cyber_terrain_type, urban_terrain_type}; // struct를 활용한 범위 지정 열거형 선언(1, 2, 3으로 초기화)enum weapon_enum {gun_type, machine_gun_type, arrow_type=10}; // 범위 미지정 열거형 선언(1, 2, 10으로 초기화)monster_enum monster_type_definition = monster_enum :: monster_a_type; terrain_enum main_field = terrain_enum :: forest_terrain_type; weapon_enum main_weapon = gun_type; // 열거형 변수에 열거형 값 대입선언시 데이터 형식을 따로 지정하지 않으면 정수형으로 자동 지정
- 수학 상수:
<numbers>헤더를 이용해 사용 가능#include <numbers> using namespace std::numbers; // 수학 상수 라이브러리 사용 선언
- 널 포인터 리터럴 nullptr
널 포인터: 식별자이자 데이터, 포인터에 메모리가 할당되지 않음/
빈 값을 나타낼 떄 사용
(기존의 NULL/ null과 같은 기능인데, NULL (= (void*)0)을 사용하면 다양한 데이터 형식으로 변환이 가능해서 오류발생 가능성이 높아짐)
=> nullptr은 명확하게 널 포인터를 나타내는 리터럴이므로 다른 데이터 형식으로 변환이 불가해 오류발생 가능성이 낮아짐
- 2진수 리터럴
리터럴 형식의 예: 16진수 표현시 0x/ 0X, 10진수 표현시 0
=> 2진수 표현시 0b/ 0B 붙여 표현
ex) 2진수 0100 표현
int bit_variable =0b0100; // int bit_variable =4
=>비트 연산을 위한 변수를 만들고 값을 지정할 때 16진수나 10진수로 표현하는 번거로움을 덜 수 있음
2) 상수 지정자 constexpr
- constexpr: 변수나 함수를 상수 표현식으로 만들어주는 키워드
=> 함수가 컴파일 시점에 상수 표현식이 되어 실행 시점에 함수 호출이 이루어지지 않고 상수로 대체됨
const와 사용법 유사
- constexpr로 선언된 변수를 변경하려고 시도하면 컴파일 오류 발생
(값이 컴파일 시점에 결정) => 프로그램이 메모리에 적재되지 않더라도 소스코드상에서 변수의 초깃값이 결정되어야 함
- const 멤버 함수: 클래스의 멤버함수를 선언할 떄 제일 뒤에 const를 추가하면, 해당 함수에서 멤버 변수를 변경할 수 없도록 강제함
const함수는 const 멤버함수만 호출할 수 있고, 멤버함수가 아닌 전역함수는 const로 만들 수 없음int get_hp() const { return hp };- constexpr은 함수선언 가장 앞 부분에 작성하며, 클래스의 멤버함수가 아닌 일반 함수에도 사용이 가능함
함수 호출문이 상수 표현식으로 치호나되면 컴파일 시간은 길어질 수 있지만 함수 호출에 필요한 절차가 생략되어 실행 시간이 빨라짐constexpr int sum_int_constexpr(int operand1, int operand2) { return operand1 +operand2; };
컴파일 시점에 상수 표현식으로 치환되려면 함수에 전달하는 인자와 함수가 반환하는 값은 반드시 리터럴이어야 함
- 제약조건:
함수의 인자와 반환값은 모두 리터럴 형식
재귀함수에 적용 가능하지만 가상함수에는 적용 불가
try-catch, goto 구문 사용 불가
if, switch, 범위기반 for문 등 모든 반복구문 사용 가능
지역변수는 반드시 초기화하거나 리터럴 형식이어야 하며, 정적 변수 허용하지 않음
- const: 고정된 값을 쉽게 활용/ 변경할 수 없게 함
#define: 가독성을 높이기 위해 사용하며 변수나 상수에 적용 가능
constexpr: 값을 고정한다는 개념보다는 컴파일 시점에 소스 코드에 맞는 고정된 값을 정의하여 함수 호출이나 변숫값의 계산시간을 줄여줌
3) function 객체
- function: std 네임 스페이스에 속한 함수 객체
(함수는 아니지만 함수처럼 호출할 수 있도록 정의한 객체)
- 함수포인터: 포인터를 활용하여 함수를 호출, 콜백 구현시 자주 사용
*콜백: 프로그램에서 다른 함수에 의해 특정한 실행이 필요할 때 호출되는 함수
=> 함수 포인터는 콜백 구현시, 여러 함수를 구조체나 배열에 포인터로 보관한 후 필요한 함수를 적절히 선택하는 알고리즘을 구현할 때 등 다양한 방식으로 사용 가능
- 함자: 함수 객체= 함수처럼 호출할 수 있는 객체
함수 호출 연산자 operator()를 오버로딩해 정의, 구조체 객체를 선언 후 객체 자체를 함수처럼 사용 가능 (클래스에서도 사용 가능)- 함수 포인터와 유사한 목적으로 사용되며, 호출 가능한 객체를 다른 함수에 전달하거나 클래스 객체 안에 저장할 수 있음
함수 포인터는 포인터로만 전달할 수 있지만, 함자는 객체이므로 객체/ 포인터/ 참조자 등 다양한 형태로 저장/ 복사/ 호출이 가능함
- function 클래스: 클래스 템플릿으로 정의되어 있으며 funcrion으로 선언된 객체에는 함수/ 함자/ 람다/ 클래스의 멤버함수를 저장하고 호출할 수 있음
- function 객체를 생성할 때는 함수처럼 반환값과 매개변수의 데이터 형식을 지정해주어야 하고, 함자나 멤버함수를 저장할 때는 객체의 주소를 함께 전달해야 함
- function은 클래스 템플릿이므로 컨테이너처럼 함수 형식 (함수, 함자, 멤버 함수, 람다 함수 등)을 < > 사이에 넣음
4) 스마트 포인터: 메모리 관리 지원
- RAII: 동적으로 할당된 메모리가 생성된 범위를 벗어나면 자동으로 해제 리소스가 필요할 때 이미 할당되어 있고 리소스가 필요 없어질 때 객체가 함께 해제되어 객체 내 변수값이 객체와 함께 일정하게 유지되는 클래스 불변성을 기초로 함
- unique_ptr: 스마트 포인터로, 포인터 객체에 RAII디자인 패턴을 적용할 수 있는 범용 스마트 포인터 클래스, 이중참조를 허용하지 않고 하나의 포인터 변수만을 허용
- 메모리 사용 범위를 벗어나면 메모리를 자동으로 해제