[C++] auto와 범위 기반 for문

[C++] auto와 범위 기반 for문

개요

안녕하세요. 이번 글에서는 C++11에서 도입된 auto 키워드와 범위 기반 for문(range-based for)에 대해 알아보겠습니다. 이 둘은 함께 쓰면 반복문 코드를 훨씬 짧고 읽기 쉽게 만들어 줍니다. 특히 반복자(iterator)로 길게 쓰던 코드를 간결하게 바꿀 수 있습니다.

auto — 타입 자동 추론

auto는 변수의 타입을 초기화 값으로부터 컴파일러가 자동으로 추론하게 합니다. 타입을 일일이 적지 않아도 되고, 길고 복잡한 타입일수록 효과가 큽니다. 단, 선언과 동시에 초기화해야 합니다.

auto i = 10;            // int
auto d = 3.14;          // double
auto s = std::string("hi"); // std::string

// 길고 복잡한 타입일수록 유용
std::vector<int> v = {1, 2, 3};
// std::vector<int>::iterator it = v.begin();  // 기존
auto it = v.begin();    // 간결

주의할 점은, auto는 초기화 값이 반드시 있어야 추론이 가능하다는 것입니다. auto x; 처럼 값 없이 선언하면 컴파일 에러입니다.

범위 기반 for문 — 컨테이너 전체 순회

범위 기반 for문은 배열이나 컨테이너의 모든 요소를 처음부터 끝까지 순회할 때 인덱스나 반복자 없이 간단히 쓸 수 있는 문법입니다. 형태는 for (타입 변수 : 컨테이너) 입니다.

std::vector<int> v = {10, 20, 30};

// 기존 방식 (인덱스)
for (size_t i = 0; i < v.size(); i++)
    std::cout << v[i] << " ";

// 범위 기반 for + auto
for (auto n : v)
    std::cout << n << " ";    // 10 20 30

auto n : v는 “v의 각 요소를 n에 하나씩 꺼내 온다”는 의미입니다. 인덱스 범위를 다룰 필요가 없어 실수가 줄어듭니다.

값 복사 vs 참조 — &의 유무

범위 기반 for문에서 &(참조)를 붙이느냐가 중요합니다. 그냥 auto는 값을 복사하므로 원본이 바뀌지 않고, auto&는 원본을 직접 참조하므로 수정이 반영됩니다.

선언의미용도
auto n값 복사읽기만 할 때 (작은 타입)
auto& n원본 참조요소를 수정할 때
const auto& n읽기 전용 참조수정 안 하고 복사도 피할 때 (큰 객체)
std::vector<int> v = {1, 2, 3};

for (auto n : v)   n *= 10;   // 복사본만 변경 → v 그대로 {1,2,3}
for (auto& n : v)  n *= 10;   // 원본 변경 → v = {10,20,30}

// 큰 객체는 복사 비용을 피하려 const 참조로 읽기
std::vector<std::string> names = {"kim", "lee"};
for (const auto& name : names)
    std::cout << name << "\n";

요소를 바꿔야 하면 auto&, 읽기만 하는데 객체가 크면 const auto&를 쓰는 것이 좋습니다.

정리

  • auto는 초기화 값으로 타입을 자동 추론한다 (선언과 동시에 초기화 필수).
  • 범위 기반 for는 컨테이너 전체를 인덱스·반복자 없이 순회한다.
  • 요소를 수정하려면 auto&, 큰 객체를 읽기만 하면 const auto&.
  • 단순 복사(읽기)면 auto, 수정이면 auto& 로 기억하면 된다.

auto와 범위 기반 for문은 C++ 코드를 짧고 안전하게 만들어 주는 기본 도구입니다. 특히 컨테이너를 다룰 때 거의 항상 함께 쓰이므로 익혀 두면 좋습니다. 이상으로 auto와 범위 기반 for문에 대해 간단히 알아보았습니다.

참고