타입을 명시적으로 쓰지 않아도 코드에 맞게 자료형을 추론해 주는 키워드
컴파일러가 컴파일하는 과정에서 실제로 자료형을 결정한다.
컴파일 단계에서 결정을 해야 하기 때문에 반드시 초기화를 해야 한다.
auto test; // 컴파일 에러
auto test2 = 1;
test2 = 3 //컴파일 에러
auto로 포인터를 받으면?
Object* pNode = new Object;
auto pNodePtr = pNode;
pNode와 pNodeptr은 동일한 포인터이다!
컴파일러가 어떤 형인지 알아낼 수 있다.
하지만 저렇게 포인터를 사용한다면 가독성이 매우 좋지 않다.
그렇다면 auto로 참조를 받으면?
Object pNode;
Object& pNodeRef = pNode;
auto pNodeRef_2 = pNodeRef;
pNodeRef_2는 참조로 받아졌을까?
참조의 경우는 복사나 대입 된거와 다르기 때문에 컴파일러가 알 수 없어서 참조로 받아 지지 않는다.
하지만 auto&를 사용 하면 레퍼런스로 받을 수 있다.
auto로 const 받으면?
const int a = 1;
auto& b = a;
b는 const를 이어 받는다.
컴파일러가 const or non-const를 알 수있다.
auto키워드의 경우
auto*, auto&, const auto& 모두 다 가능하기 때문에 포인터를 사용하거나 참조를 사용 할 때는 해당 키워드를 통해서 사용 해 주도록하자
auto를 사용하게 되면 타이핑이 줄어 들 순 있지만 가독성이 매우 좋지 않기 때문에 협업시 그닥 좋지는 않은거 같다.
다만 반복자나, 템플릿의 경우는 예외로 사용 해도 좋다고 생각한다.
반복자
for(std::vector<int>::const_iterator it = vec.begin(); it != vec.end(); ++it)
{
........
}
for( const auto& it = vec.begin(); it != vec.end(); ++it)
{
........
}
템플릿
create<Enemy>* pEnemy = new create<Enemy>(100);
auto* pEnemy = new create<Enemy>(100);
반복자의 경우는 많이 귀찮기 때문에...
컴파일 단계에서 결정이 나기 때문에 런타임 성능은 동일하여 사용 하는건 무방하나.. 명시적이지 않아서 가독성이
나쁘니 선택을 잘 하여서 쓰자.
공부한 내용을 정리하는 거라 잘못 된 부분이 있을 수 있습니다.