10-1. auto 문법

Crat3 ㅣ 2023. 6. 20. 14:24

0. Modern C++

C++ 11 (2011년도) 이후의 개선된 버전을 이름.

 

1. auto

(1) 기본 사용법

class Knight
{
public:
    int _hp;
};

여러가지 타입을 가진 변수들을 만들어보자.

int main()
{
    int a = 3;
    float b = 3.12f;
    double c = 1.23;
    knight d = Knight();
    const char* e = "ABC"
    //~~

이런 여러가지 타입의 변수들을 auto 문법을 이용하면

//~~
    auto a = 3;
    auto b = 3.12f;
    auto c = 1.23;
    auto d = Knight();
    auto e = "ABC"

컴파일러가 자동으로 판별하여 타입을 맞춰준다(형식 연역 ; Type Deduction).

 

(2) 컴파일러의 추론을 유도하기

    const auto test1 = b;
    auto* test2 = d;

본래 float형 이었던 b를 test1에 const를 붙여서 const float형으로 만들어주거나

본래 const char의 포인터형이었던 d를 test2에 대입할 때, auto 뒤에 포인터 연산자를 붙여 test2도 const char의 포인터형으로 추론하게 할 수 있다.

 

2. 주의점

아무것도 붙어있지 않은 auto는 const와 참조 연산자 '&'를 무시한다.

따라서 const 또는 참조 연산자를 사용할 것이라면, auto의 앞 뒤에 명시해주어야 한다.

vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);

for (vector<int>::size_type i = 0; i < v.size(); i++)
{
    auto& data = v[i];
    data = 100;
}

위의 코드에서 &를 제거하면 기본적으로 int형으로 추론되어 벡터의 요소들의 값을 변경하지 못한다.

 

3. 언제 사용할까?

(1) 코드의 타이핑이 길어질 때

 

(2) 변수의 타입을 굳이 알 필요가 없을 때

- map, multimap, set, multiset에서 페어링 할 때

map<int, int> m;
auto pair = m.insert(make_pair(1, 100);

 

- 반복자를 사용할 때

for (vector<int>::iterator it = v.begin(); it != v.end(); ++it)
{
	cout << *it << endl;
}

반복자의 형식은 궁금하지 않으므로(어차피 포인터이므로) 단지 사용만 할 때는 이렇게 대체할 수 있다.

for (auto it = v.begin(); it != v.end(); ++it)
{
	cout << *it << endl;
}

 

'기초 C++ 스터디 > 모던 C++' 카테고리의 다른 글

10-6. override, final  (0) 2023.06.20
10-5. delete - 삭제된 함수  (0) 2023.06.20
10-4. enum class  (0) 2023.06.20
10-3. nullptr  (0) 2023.06.20
10-2. 중괄호 초기화  (0) 2023.06.20