C++ 공부

범위 기반 반복문 (Range-based for loop)

Client Side 2025. 10. 5. 15:29

기존의 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;
}

 

문제풀이 : 구조체 안의 특정 멤버에 접근하려면 . 연산자를 사용하면 된다.