Ch06. 복합데이터 - 09. Range-based for

2025. 4. 8. 18:39Programming Language/C++

반응형

1. Range-based for

C++11에서 도입된 문법으로 배열이나 STL 컨테이너의 원소들을 간결하게 순회할 수 있게 해주는 for문이다.

 

기존의 for문의 경우는 

for (int i = 0; i < arr.size(); ++i) {
    std::cout << arr[i] << std::endl;
}

이렇게 사이즈를 알아야만 사용할 수 있었던 반면 Range-based for 방식의 경우는

for (int value : arr) {
    std::cout << value << std::endl;
}

좀더 간결하고 가독성있게 사용이 가능하다.

 

기본 문법의 형태는

for (변수 : 순회 대상) {
    // 반복문 본문
}

로 사용하고 

 

실 사용법은

std::arr<int, 5> nums = {1, 2, 3, 4, 5};

for (int n : nums) {
    std::cout << n << std::endl;
}

이렇게 사용이 가능하다.

 

물론 일반 arr의 경우도 해당 방법이 사용이 가능하다.

int arr[] = {1, 2, 3, 4, 5};

for (int n : arr) {
    std::cout << n << std::endl;
}

 

이건 순회가 가능한 모든 타입이 사용이 가능한데 

struct Student {
	int number;
    char name[10];
    float height;
};

int main() {
    Student student [] = {
    	Student{1, "Kim", 167.5f},
        Student{2, "Park", 183.2f}
    };
    
    for(Student p : student ){
    	std::cout << p.number << std::endl;
        std::cout << p.name << std::endl;
        std::cout << p.height << std::endl;
    }
}

 

이렇게 구조체 배열에도 사용이 가능하다.

 

여기서 구조체의 경우는 이전에 설명했던것 처럼

이렇게 복사하는 경우 주소값 자체를 공유하는 것이 아니기 때문에 

복사된 구조체를 변경한다고 해서 원본의 구조체가 변경되지 않는다는 점을 기억할 것이다.

 

Range-based for 문법의 경우도 결국 

이렇게 선언되어 있는 구조체 배열의 요소 하나 하나를 

for문을 도는 회차마다 students 배열 요소 하나를 떼어다 Student p라는 변수에 복사해서 넣어주는 것이라서 

이렇게 값을 변경하는 for문을 넣어도 

출력해보면

값이 동일한 것을 알 수 있다.

 

이걸 해결하는 방법은 이전에 구조체 명의 뒤에 &를 붙여 레퍼런스로 만들어 주는 방법을 사용한다면 

이렇게 변경되는 것을 볼 수 있다.

 

추가로 구조체 배열의 요소인 char 배열의 경우는 

이렇게 넣는것은 불가능하고 

이렇게 strcpy를 사용해줘야만 가능하다.

 

이건 모든 배열에 동일하다고 보면 된다.

이렇게 일반 for문을 사용하면 직접 배열에 접근해서 값을 넣어주기 때문에

이렇게 값이 정상적으로 들어가는데 반면

이렇게 값을 복사해서 사용하는 경우에는

정상적으로 값이 들어가지 않는다.

이 또한 &연산자를 통해서 레퍼런스를 만들어서 넣어주면

정상적으로 값이 들어가는 것을 볼 수 있다.

 

 

이 부분은 포인터의 Call-by-reference, Call-by-value를 배우다 보면서 알게 될것이다

우선은 그냥 대충 이렇다고 만 알고 있자.

반응형