C++ 초급 - 2. 기본 문법 (2 - auto 타입 추론 (C++11))

2025. 2. 12. 11:41프로그래밍 언어/C++

2.2 auto 타입 추론 (C++11)

C++11부터 auto 키워드를 사용하면 변수의 데이터 타입을 명시적으로 지정하지 않고도, 컴파일러가 자동으로 타입을 추론할 수 있다.
이는 코드의 가독성을 높이고, 유지보수를 쉽게 하며, 반복적인 타입 선언을 줄이는 데 유용하다.


📌 auto 키워드의 기본 사용법

컴파일러는 우변(할당된 값)의 데이터 타입을 기반으로 auto의 타입을 결정한다.

#include <iostream>

int main() {
    auto num = 42;       // int
    auto pi = 3.14;      // double
    auto isValid = true; // bool

    std::cout << "num: " << num << " (int)" << std::endl;
    std::cout << "pi: " << pi << " (double)" << std::endl;
    std::cout << "isValid: " << isValid << " (bool)" << std::endl;

    return 0;
}

🔹 출력 결과

num: 42 (int)
pi: 3.14 (double)
isValid: 1 (bool)

💡 컴파일러가 자동으로 타입을 결정하는 과정

  • 42 → 정수이므로 int
  • 3.14 → 부동소수점이므로 double
  • true → 논리형이므로 bool

📌 auto 키워드를 사용할 때의 장점

1. 가독성 향상

auto를 사용하면 복잡한 데이터 타입을 직접 명시하지 않아도 되므로, 코드가 더 깔끔하고 읽기 쉬워진다.

std::vector<int>::iterator it = myVector.begin(); // 기존 방식
auto it = myVector.begin(); // auto 사용

2. 유지보수 용이

코드 변경 시 타입을 다시 수정할 필요 없이, 컴파일러가 알아서 타입을 맞춰준다.

auto myValue = getSomeValue(); // 반환 타입이 바뀌어도 코드 수정 불필요

3. 반복적인 타입 선언 제거

템플릿을 사용할 때 타입이 길어지는 경우가 많은데, auto를 활용하면 코드가 훨씬 간결해진다.

std::map<std::string, std::vector<int>> myMap;
auto it = myMap.begin(); // 타입을 직접 쓰지 않아도 됨

📌 auto의 다양한 활용 예제

1. 반복문에서 활용

auto를 사용하면 컨테이너의 요소 타입을 명시할 필요 없이, 쉽게 반복문을 작성할 수 있다.

(1) auto와 for 반복문

#include <iostream>
#include <vector>

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5};

    // auto를 사용하여 요소 타입을 자동 추론
    for (auto num : numbers) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}

🔹 출력 결과

1 2 3 4 5

(2) auto와 for 반복문 (참조 사용)

for (auto& num : numbers) {
    num *= 2; // 벡터 요소의 값을 직접 변경
}

2. 함수 반환값 저장

C++11부터 auto는 함수의 반환값을 저장하는 변수에도 사용할 수 있다.

#include <iostream>

int getNumber() {
    return 100;
}

int main() {
    auto value = getNumber(); // 반환값(int) 타입을 자동 추론
    std::cout << "value: " << value << std::endl;
    return 0;
}

📌 auto 사용 시 주의할 점

1. auto는 선언과 동시에 초기화해야 함

auto x; // 오류: 초기화되지 않으면 타입을 추론할 수 없음
  • auto는 반드시 초기화와 함께 사용해야 한다.

2. auto는 상수(const)와 함께 사용할 때 주의

const int num = 10;
auto x = num;  // int (const 속성 제거됨)
const auto y = num; // const 유지됨
  • auto는 기본적으로 const 속성을 제거하므로, 필요한 경우 const auto로 선언해야 한다.

3. auto는 배열의 타입을 추론할 수 없음

int arr[] = {1, 2, 3};
auto x = arr; // x는 int* (포인터)로 해석됨, 배열이 아님
  • auto를 사용하면 배열이 아니라 포인터로 해석된다.

📌 C++14 이후 auto 관련 확장

1. auto를 반환 타입으로 사용 가능 (C++14)

auto add(int a, int b) {
    return a + b; // 반환 타입 자동 추론 (int)
}

2. decltype(auto) (C++14)

  • decltype(auto)를 사용하면 auto가 제거하는 const 속성을 유지할 수 있다.
const int num = 10;
decltype(auto) x = num; // const 유지됨

정리

특징 설명
auto 사용 컴파일러가 변수의 타입을 자동으로 추론
장점 코드 가독성 향상, 유지보수 용이, 반복적인 타입 선언 제거
활용 반복문, 함수 반환값 저장, 복잡한 컨테이너 타입
주의점 초기화 필수, const 속성 제거 가능, 배열 선언 시 포인터로 변환됨
C++14 확장 함수 반환 타입 auto, decltype(auto) 추가