코드 여행자

C++11] auto keyword 기본 및 활용 본문

C++ 11, 14, 17

C++11] auto keyword 기본 및 활용

알 수 없는 사용자 2019. 10. 27. 17:07

오늘은 C++11 부터 아주 유용하게 사용 되고 있는 auto keyword 에 대해 정리해 보도록 하겠습니다. 


C++ 에서는 현재 int, double, short... 등 다양한 자료형을 지원하고 있습니다.

보통 프로그래밍을 할 때는 개발자가 저장할 자료의 형태에 따라 적절한 자료형을 선택하지만, auto keyword 는 이런 자료형을 대신할 수 있습니다. 


특정 변수에 자료형 대신 auto keyword 를 붙이게 되면, 이는 개발자가 자료형을 선택하는 것이 아닌, 컴파일러에게 컴파일 타임에 변수 타입을 유추하도록 지시하는 것입니다. 이를 다른 말로 Type Inference (타입추론) 이라고도 하는데요. 


가장 기본적인 사용 형태에 대해 코드로 확인해 보겠습니다. 



코드

int main(int argc, const char * argv[]) {
    auto age = 32;
    std::cout << "size of age " << sizeof(age) << ", type " << typeid(age).name() << std::endl;
    
    auto height = 162.5;
    std::cout << "size of height " << sizeof(height) << ", type " << typeid(height).name() << std::endl;
    
    return 0;
}


실행결과

size of age 4, type i

size of height 8, type d



로컬변수 age 는 32 라는 정수값으로 초기화 해 주었고, height 는 162.5 라는 실수값으로 초기화 해 주었습니다. 

두 변수의 size 를 각각 출력해 보니, 각각 int / double 자료형으로 추론된 것을 확인 할 수 있습니다. 


당연한 얘기겠지만, auto keyword의 경우 초기화 된 값을 보고 자료형을 추론하는 것이기 때문에,

초기 값이 없거나, 자료형을 추론할 수 없는경우 (함수의 매개변수로 사용되는 경우) 에는 사용이 불가능합니다. 



코드

auto add(int a, int b) // 매개변수 a, b를 auto로 지정시 초기값이 없으므로 타입 추론 불가하여 Error 발생!
{
    return a+b;
}

int main(int argc, const char * argv[]) {
    auto value1 = 1;          // value1 은 값 1에 의해 int 로 추론됨
    auto value2 = value1; // value1 이 int 이기 때문에 value2 도 int 로 추론 됨

    auto addResult = add(value1, value2); // 함수의 return 값은 매개변수의 type에 의해 추론 가능하므로 auto keyword 사용 가능

    std::cout << "result " << addResult << ", size of add result " << sizeof(addResult) << ", type " << typeid(addResult).name() << std::endl;
    return 0;
}


실행결과

result 2, size of add result 4, type i 



위와 같은 경우에 add 함수의 매개변수인 a, b 에 auto keyword를 지정한다면, 컴파일러는 해당 함수 호출 시 어떤 데이터가 들어오는지 알 수 없기 때문에

'auto' not allowed in function prototype error 가 발생 합니다.

하지만 return type 의 경우 a + b 는 int 형으로 추론할 수 있기 때문에 auto keyword 를 사용할 수 있습니다.


auto keyword 는 위와 같은 기본 자료형 이외에 포인터 및 레퍼런스에도 활용 가능하며, 람다함수에서도 유용하게 사용됩니다.



코드

int main(int argc, const char * argv[]) {
    auto addFuc = [](int a, int b){ return a+b; };
    auto result = addFuc(1, 2);
    std::cout << "result " << result << std::endl;
    
    auto divideFuc = [](double a, double b)->double{return a/b;};
    result = divideFuc(9.0, 2.0);  // 이미 앞에서 int 형태로 자료형이 정해진 경우, 다시 재 추론 하지 않고 기존의 자료형을 유지합니다.
    std::cout << "reslut " << result << ", type " << typeid(result).name() << std::endl;
    return 0;
}



실행결과

result 3

result 4, type i 




특히 아래와 같은  반복문에서 auto 를 사용하면 기존의 type 을 다시 적어줄 필요가 없어 편리하게 사용할 수 있습니다.

 


코드

int main(int argc, const char * argv[]) {

    std::vector mNames;
    mNames.insert(mNames.end(), "Olivia");
    mNames.insert(mNames.end(), "Lily");
    mNames.insert(mNames.end(), "Zoe");
    mNames.insert(mNames.end(), "Ava");

    for(auto name : mNames) {
        std::cout << "name " << name << std::endl;
    }

    auto name = std::find(mNames.begin(), mNames.end(), "Zoe");
    sstd::cout << "Find name type " << typeid(name).name() << " name " << *name << std::endl;
}



실행결과

name Olivia

name Lily

name Zoe

name Ava

Find name type NSt3__111__wrap_iterIPNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEE name Zoe 

 



데이터의 자료형을 추론할 수 없는 부분에서 무분별한 auto keyword  의 사용은  코드의 가독성을 떨어뜨릴 위험이 있지만,

적절한 곳에서 auto keyword 를 활용 한다면 매우 편리하게 코딩할 수 있을것 같네요! 




'C++ 11, 14, 17' 카테고리의 다른 글

C++11] Range Based for loop 사용법  (0) 2019.11.18
Comments