기존의 for 문은 보통 for (int i = 0; i < size; ++i) 이런 식으로 인덱스를 써서 배열이나 벡터의 각 요소에 접근했었다.
그런데 범위 기반 반복문은 말 그대로 어떤 '범위' 안에 있는 모든 요소들을 하나씩 반복해서 처리할 때 쓰는 문법이다.
마치 "이 컨테이너에 있는 모든 것들에 대해 이걸 해줘!" 라고 말하는 것과 같다. 훨씬 더 간단하고 직관적이다.
장점
1) 코드 길이가 짧아진다
2) 가독성이 좋아져
3) 실수할 가능성이 줄어든다
사용법
기본 형태
for (타입 요소변수 : 컨테이너)
{}
컨테이너는 vector, array, string과 c 스타일 배열도 가능하다.
타입 요소변수 부분이 가장 중요하다.
여기서 어떻게 쓰느냐에 따라 요소가 복사되거나, 참조되거나, 상수로 참조되는지가 달라진다.
1. for (auto element : container) (값 복사)
- 컨테이너의 각 요소를 복사해서 element에 저장한다.
- element를 수정해도 원본 컨테이너의 값은 바뀌지 않는다.
- 작은 타입에는 괜찮지만, 복사 비용이 큰 복잡한 객체에는 비효율적일 수 있다.
- 사용 예시 : for (int num : numbers)
2. for (auto& element : container) (참조, 값 수정 가능)
- 컨테이너의 각 요소를 참조로 element에 연결한다. (원본과 같은 메모리 주소를 가리킨다.)
- element를 수정하면 원본 컨테이너의 값도 함께 바뀐다.
- 대부분의 경우게 효율적이며, 요소를 직접 수정하고 싶을 때 사용한다.
- 사용 예시 : for (int& num : numbers)
3. for (const auto& element : contatiner) (상수 참조, 값 수정 불가능)
- 컨테이너의 각 요소를 상수 참조로 element에 연결한다.
- 원본 값을 읽기만 하고, 수정할 수는 없다.
- 가장 일반적으로 사용되는 형태. 값을 수정할 필요가 없을 때 가장 효율적이고 안전하다.
- 사용 예시 : for (const int& num : numbers)
예시 코드
#include <iostream>
#include <vector>
#include <string>
int main() {
std::vector<int> numbers = {10, 20, 30, 40, 50};
std::string text = "Hello, SeungJae!";
std::cout << "--- 1. 값 복사 (auto) ---" << std::endl;
// 값을 복사해서 가져오기. element를 바꿔도 numbers는 안 바뀜.
for (auto num : numbers) {
num += 1; // num 값만 1 증가
std::cout << num << " ";
}
std::cout << std::endl; // 출력: 11 21 31 41 51
std::cout << "원본 numbers: ";
for (int num : numbers) { std::cout << num << " "; } // 출력: 10 20 30 40 50 (원본은 그대로!)
std::cout << std::endl;
std::cout << "\n--- 2. 참조 (auto&) ---" << std::endl;
// 참조로 가져오기. element를 바꾸면 numbers도 바뀜.
for (auto& num : numbers) {
num += 1; // 원본 numbers의 값도 1 증가!
std::cout << num << " ";
}
std::cout << std::endl; // 출력: 11 21 31 41 51 (numbers가 이미 바뀜)
std::cout << "수정된 numbers: ";
for (int num : numbers) { std::cout << num << " "; } // 출력: 11 21 31 41 51 (원본도 바뀜!)
std::cout << std::endl;
std::cout << "\n--- 3. 상수 참조 (const auto&) ---" << std::endl;
// 상수 참조로 가져오기. 원본을 변경할 수 없음.
for (const auto& ch : text) {
// ch = 'x'; // (X) 컴파일 에러! 상수는 바꿀 수 없어!
std::cout << ch << "-";
}
std::cout << std::endl; // 출력: H-e-l-l-o-,- -S-e-u-n-g-J-a-e-!-
return 0;
}
✨ 기초 연습 문제
1. 정수형 벡터 scores = {85, 92, 78, 65, 95}를 선언하고 초기화하세요
2. 범위 기반 반복문 (auto&를 사용)을 이용해서 모든 scores에 5점씩 가산점을 주세요.
3. 가산점이 적용된 scores 벡터의 모든 원소를 다시 범위 기반 반복문 (const auto&를 사용)으로 출력하세요.
응용연습문제 1 : 문자열 배열에서 가장 긴 문자열 찾기
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main() {
vector<string> words = {"apple", "banana", "kiwi", "strawberry", "grape"};
string longest = "";
// 범위 기반 반복문을 사용해서 가장 긴 문자열을 찾아 longest에 저장하세요
// 여기에 코드 작성
cout << "가장 긴 단어: " << longest << endl;
return 0;
}
문제풀이 : length()를 통해 단어의 길이를 반복적으로 비교하여 longest보다 길면 word를 longest에 넣는다.
응용연습문제 2 : 2차원 벡터 합계 계산하기
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<vector<int>> matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
int sum = 0;
// 범위 기반 반복문을 중첩해서 matrix의 모든 요소의 합을 구해보세요
// 여기에 코드 작성
cout << "행렬의 모든 요소 합: " << sum << endl;
return 0;
}
문제풀이 : 행과 열이 있기 때문에 반복문을 이중으로 만들어줘야 한다.
// 범위 기반 반복문을 중첩해서 모든 요소의 합 구하기
for (const auto& row : matrix) { // 각 행에 대해
for (const auto& element : row) { // 행의 각 요소에 대해
sum += element; // 합계에 더하기
}
}
응용연습문제 3 : 구조체 벡터 다루기
#include <iostream>
#include <vector>
#include <string>
using namespace std;
struct Student {
string name;
int score;
};
int main() {
vector<Student> students = {
{"Kim", 85},
{"Lee", 92},
{"Park", 78},
{"Choi", 95},
{"Jeon", 88}
};
// 범위 기반 반복문을 사용해서 90점 이상인 학생들의 이름을 출력해보세요
// 여기에 코드 작성
return 0;
}
문제풀이 : 구조체 안의 특정 멤버에 접근하려면 . 연산자를 사용하면 된다.
'C++ 공부' 카테고리의 다른 글
| N번째 큰 수 찾기 (std::nth_element) (0) | 2025.10.24 |
|---|---|
| 25.10.05 연습문제 풀이 (범위 기반 반복문) (0) | 2025.10.07 |
| istringstream (1) | 2025.10.01 |
| 최대공약수와 최소공배수를 구하는 함수 (0) | 2025.09.29 |
| 스마트포인터와 벡터를 이용한 객체 생성 기초 (+ 이름 검색하기) (0) | 2025.09.08 |