범위 기반 for: 컨테이너를 읽기 쉽게 순회하기
8강. 범위 기반 for: 컨테이너를 읽기 쉽게 순회하기
이번 강의에서 해결할 문제
목록의 모든 값을 읽는 데도 인덱스 초기화·범위 조건·증가식을 직접 쓰면 범위를 벗어나는 실수가 생기고 실제 관심사인 원소 처리가 가려집니다. 원소를 값으로 복사할지 참조로 다룰지도 분명해야 합니다.
학습 목표
- 인덱스가 필요한 반복과 원소 순회의 차이를 구분합니다.
- 값,
auto&,const auto&순회를 선택합니다. - 원본 수정 여부를 실행 결과로 확인합니다.
먼저 알아야 할 핵심 개념
범위 기반 for는 for (선언 : 범위) 형태로 컨테이너의 각 원소를 방문합니다. 값으로 받으면 복사본, 참조로 받으면 원본을 다룹니다. 큰 객체를 읽기만 할 때는 const auto&, 원본 수정이 필요할 때는 auto&가 일반적인 선택입니다.
가장 작은 실행 가능한 예제
#include <iostream>
#include <vector>
int main() {
std::vector<int> itemCounts{1, 2, 3};
for (auto& count : itemCounts) {
count += 1;
}
for (const auto count : itemCounts) {
std::cout << count << ' ';
}
std::cout << '\n';
}
핵심 코드 줄별 설명
- 첫 반복의
auto&는 각 원본 정수의 별칭입니다. count += 1이vector안의 값 자체를 바꿉니다.- 두 번째 반복은 작은 정수를 값으로 읽습니다.
- 출력 반복은 원본을 수정하지 않습니다.
- 현재 위치 번호가 필요하지 않아 인덱스를 만들지 않았습니다.
실행 결과와 값 변화
2 3 4
첫 반복에서 auto&를 auto로 바꾸면 복사본만 증가해 출력은 원래 값 1 2 3이 됩니다. & 하나가 원본 수정 여부를 바꿉니다.
단계별 실습
실습 목표
플레이어 이름 목록을 읽고 경험치 목록을 수정합니다.
시작 전 상태와 실행 방법
vector<string> names와 vector<int> experience를 준비합니다.
1단계: 최소 코드 작성
이름을 const auto&로 순회해 출력합니다.
2단계: 값 또는 조건을 바꿔 결과 비교
경험치를 값으로 순회해 10을 더한 뒤 원본이 바뀌지 않는지 확인합니다.
3단계: 작은 기능 확장
경험치를 auto&로 순회해 실제 원본에 10을 더합니다.
4단계: 스스로 해결하기
이름과 경험치를 같은 위치끼리 함께 출력해야 한다면 범위 기반 반복만으로 충분한지 판단하고 인덱스 반복을 선택하세요.
막혔을 때
문자열 타입 오류가 나면 <string>과 <vector>를 포함했는지 확인합니다. const auto& 원소를 수정하려 하면 컴파일 오류가 나는 것이 정상입니다.
흔한 실수와 해결 방법
- 수정하려는데 값으로 순회: 원본을 바꿔야 할 때만
auto&를 사용합니다. - 큰 객체를 매번 복사: 읽기 전용이면
const auto&로 비용을 줄입니다. - 위치가 필요한데 억지로 범위 for 사용: 인덱스 의미가 요구사항이면 명시적 인덱스가 더 명확합니다.
게임 개발 연결
인벤토리 아이템, 적 목록, 점수 목록을 순회할 때 자주 사용합니다. 순회 중 컨테이너에 원소를 추가·삭제하면 반복자가 무효화될 수 있으므로 구조 변경은 별도 단계로 분리하고 심화 과정에서 규칙을 자세히 다룹니다.
이해 점검 질문 3개
- 값 순회와 참조 순회의 원본 상태 차이는 무엇인가요?
- 큰 객체를 읽기만 할 때
const auto&가 적합한 이유는 무엇인가요? - 범위 기반
for보다 인덱스 반복이 더 나은 상황은 언제인가요?
핵심 요약
범위 기반 for는 모든 원소를 방문한다는 목적을 간단히 표현합니다. 복사·읽기·수정 중 무엇이 필요한지 결정한 뒤 값, const 참조, 수정 참조를 선택합니다.
다음 강의 연결
9강. 구조적 바인딩에서 하나의 원소 안에 묶인 이름과 값을 읽기 좋은 지역 이름으로 분해합니다.
범위 기반 for: 컨테이너를 읽기 쉽게 순회하기 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.