WinCNT

Modern C++ - Auto 본문

게임 프로그래밍(학습 내용 정리)/Modern C++

Modern C++ - Auto

WinCNT_SSS 2022. 3. 24. 11:27

auto 키워드는 어떻게 생겨났을까?

C언어는 운영 체제(유닉스)를 만들기 위해 만든 언어
자료형도 운영 체제 제작 시, 프로그래머의 실수를 알 수 있도록 만들어 진 것
자료형으로 데이터들을 구분하면, 컴파일 에러 등으로 버그를 미리 파악할 수 있게 되고
결과적으로 런타임 에러를 줄일 수 있게 된 것이다
그러므로 프로그래밍할 때의 원칙은 자료형을 명확하게 하는 것이라 할 수 있다

반대로, 타입을 맞출 필요가 없는 경우에는 auto를 사용하여 생산성을 높일 수 있다
함수의 리턴 값을 auto로 받거나(C++ 18부터는 리턴에 auto 사용이 가능해짐),
긴 자료형을 축약하거나(std 사용 시 편리함) 등등

auto 키워드의 사용 예

std 사용 시 auto를 사용하면 편리하다(특히 iterator와 같은 복잡한 이름)

std::vector<int> v = { 1, 2, 3, 4, 5 };
//for (std::vector<int>::iterator it = v.begin(); it != v.end(); ++it) {}
for (auto it = v.begin(); it != v.end(); ++it){ }

템플릿을 사용한 클래스 등에 auto을 사용하면 축약할 수 있다

//MyArr<int>* a = new MyArr<int>(10);
auto* a = new MyArr<int>(10);

선언이 복잡한 함수 포인터에 auto를 사용하면 쉽게 선언할 수 있다

//int (*funcPtr)(int, int) = add;
auto funcPtr = add;
auto result = funcPtr(1, 2);

함수의 return 값 등도 auto로 받을 수 있다

auto sum = add(3, 5);

함수의 리턴 타임에도 auto를 사용할 수 있다(C++ 18 즈음 이후)

auto addRetAuto(int x, int y) { return x + y; } // C++ 18 즈음에 가능해짐

 

람다식의 리턴 타입에도 auto를 사용할 수 있다

또한 람다식의 매개변수에는 예외적으로 auto를 사용할 수 있다

auto test = [](int* a)->int& {return *a; };

auto func = [](auto x, auto y) {return x + y; };
std::cout << func(11., 5) << " " << func(3.7, 23.1) << std::endl;

 

auto 키워드를 좀 더 명확하게 사용하는 방법

포인터나 참조형을 auto로 받을 경우, 코드의 명확성이 떨어진다

가능한 한 auto에 포인터나 참조형을 붙여서 코드를 명확하게 해준 것이 좋다

Cat* myCat = new Cat("CoCo", 2);
//auto myCat = myCat;
auto* myCatPtr = myCat;
auto& myCatRef = myCat;

 

auto는 const를 무시하므로 포인터나 참조형과 마찬가지로 명확하게 붙여주는 것이 좋다

(volatile등의 키워드도 마찬가지임)

const int b = 1;
auto a1 = b;			// a1은 int
const auto a2 = b;		// a2은 const int 
auto& a3 = b;			// a3는 const int&
const auto& a4 = b;		// a4는 const int&

volatile int vx = 1024;
auto avx = vx;			// int
volatile auto vavx = vx;	// volatile int

포인터와 참조형의 인수 차이

포인터의 경우는 간접 전달으로 객체에 접근하려면 한 번 더 찾아야 한다(*p 등)

참조형의 경우는 객체 그 자체에 접근 가능함

 

SSS