개요
안녕하세요. 이번 글에서는 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문에 대해 간단히 알아보았습니다.