범위 기반 for 루프(range-based for loop)는 C++11 표준에서 새롭게 추가된 문법으로, 기존의 전통적인 for 루프를 더 간결하게 표현할 수 있는 형태입니다. 컨테이너(container)의 첫 번째 요소부터 마지막 요소까지 순차적으로 순회(iteration)해야 할 때 특히 유용합니다.
기본 문법
for( range-declaration : range-expression ) loop statement
range-declaration(범위 선언) — range-expression의 요소 타입과 동일한 타입으로 변수를 선언하는 부분입니다. 일반적으로 auto 키워드를 사용하면 range-expression 내 요소의 타입을 자동으로 추론해 주므로 편리합니다.
range-expression(범위 표현식) — 순회할 요소들의 시퀀스를 나타내는 표현식입니다. 배열, STL 컨테이너 등이 해당되며, 중괄호 {}로 감싼 초기화 리스트도 사용할 수 있습니다.
loop-statement(루프 본문) — range-expression의 끝에 도달할 때까지 반복 실행될 하나 이상의 문장으로 구성된 루프의 몸체입니다.
전통적인 for 루프와의 비교
// 배열 순회 예시
int arr[] = { 10, 20, 30, 40, 50 };
// 범위 기반 for 루프
for (int num : arr)
printf("%d, ", num);
// 위 코드는 아래와 동일하게 동작합니다.
for (int i = 0; i < 5; i++)
printf("%d, ", arr[i]);위 예시에서 알 수 있듯이, 범위 기반 for 루프는 배열의 크기를 직접 계산할 필요가 없으므로 조건식이 불필요하며, 증감 연산자도 작성하지 않아도 됩니다. 각 반복마다 변수 num은 배열 arr[]의 요소 값을 처음부터 끝까지 차례대로 하나씩 받게 됩니다.
점프 문(Jump Statement)과의 조합
break — 남은 모든 반복을 중단하고 루프를 즉시 종료합니다.
continue — 현재 반복을 건너뛰고 다음 반복으로 넘어갑니다.
goto — 레이블이 지정된 문장으로 프로그램의 흐름을 점프시켜 루프를 벗어납니다.
범위 기반 for 루프의 장점
문법이 단순하고 사용하기 쉽습니다.
컨테이너의 요소 개수나 range-expression의 크기를 직접 계산할 필요가 없습니다.
range-declaration의 데이터 타입을 알 수 없는 경우
auto지정자를 사용하면 range-expression의 타입과 자동으로 호환됩니다.조건문이나 증감문이 필요 없어 코드가 간결해집니다.
컨테이너 전체를 한 번에 순회하는 경우에 가장 적합합니다.
범위 기반 for 루프의 단점
begin()부터end()사이의 모든 요소를 순회하므로, 특정 인덱스만 따로 처리할 수 없습니다.특정 요소를 다시 방문하거나 요소 그룹을 건너뛰는 동작은 불가능합니다.
배열을 역순으로 순회할 수 없습니다. 역순 순회가 필요하다면
<boost/range/adaptor/reversed.hpp>같은 외부 라이브러리를 활용해야 합니다.
예제 코드
#include <iostream>
#include <vector>
#include <map>
int main() {
int arr[] = { 10, 20, 30, 40, 50 };
// 전통적인 for 루프
for (int i = 0; i < 5; i++)
printf("%d, ", arr[i]);
printf("\n");
// 범위 기반 for 루프
for (int num : arr)
printf("%d, ", num);
printf("\n");
// 문자 배열 순회
char str[] = "Hello World";
for (char c : str)
printf("%c ", c);
printf("\n");
// 문자열 리터럴 직접 순회
for (char c : "Hello World")
printf("%c ", c);
printf("\n");
// std::map 순회 (auto 활용)
std::map<int, char> MAP({{1, 'A'}, {2, 'B'}, {3, 'C'}});
for (auto m : MAP)
printf("{ %d, %c }", m.first, m.second);
return 0;
}실행 결과
10, 20, 30, 40, 50,
10, 20, 30, 40, 50,
H e l l o W o r l d
H e l l o W o r l d
{ 1, A }{ 2, B }{ 3, C }이처럼 범위 기반 for 루프는 배열, 문자열, STL 컨테이너 등 다양한 자료구조를 일관된 방식으로 손쉽게 순회할 수 있게 해주는 강력한 기능입니다. 다만 인덱스 제어나 역방향 순회가 필요한 상황에서는 전통적인 for 루프나 반복자(iterator)를 사용하는 것이 더 적합합니다.