C++0x 미리보기 10, 범위 기반 for 루프

Twitter icon류광, 2008-12-31 21:12
대중적으로 인기 있는 C++0x 기능인 범위 기반 for 루프를 간단히 설명하고, 한 가지 주의점도 이야기합니다.

아마도 가장 잘 알려진, 그리고 auto와 함께 가장 환영 받는 C++0x 기능이 바로 범위 기반 for 루프일 것입니다. 설명하기도 간단합니다. int 벡터의 모든 요소를 출력한다고 합시다. 기존 C++에서는 이런 코드가 필요합니다.

vector<int> vec = ...;
for(vector<int>::iterator itr = vec.begin();
    itr != vec.end(); ++itr)
  std::cout << *itr;

C++0x의 auto 새 용법(나중에 다른 글에서 다루겠습니다)을 사용하면 조금 더 간결하게 만들 수 있겠지만, C++0x에서 좀 더 직접적인 방식은 다음처럼 범위 기반 for를 이용하는 것입니다.

for( int i : vec )
   std::cout << i;

STL 컨테이너 뿐만 아니라 기본 배열도 가능하고, 또한 배열의 원소들을 수정하는 것도 가능합니다. 다음은 그 둘을 모두 보여주는 예입니다.

int array[5] = { 1, 2, 3, 4, 5 }; // 보통의 배열
for (int& x : array) // int가 아니라 int&
  x *= 2; // 해당 요소가 실제로 변경됨

최종 사용자가 범위 기반 for에 대해 알아야 할 것은 이게 다입니다. 굳이 한 가지 더 추가하자면, 루프 변수가 반드시 for 문 자체에서 선언된 지역 변수이어야 한다는 점입니다. 즉, 다음은 유효하지 않습니다.

int array[] = ...
int i = -1;
for(i : array) // 오류
  ...

코딩 스타일에 따라서는 이것이 심각한 제약일 수도 있겠습니다. 예를 들어 순차 검색을 다음과 같이 구현하는 분들도 있을 것입니다.

vector<int>::iterator itr = vec.begin();
for(; itr != vec.end();  ++itr)
{
  if (*itr == to_find) break;
}
if (itr != vec.end()) // 찾았음
  ...

범위 기반 for는 이런 방식을 지원하지 않습니다. 따라서 이를테면 bool found 같은 변수를 따로 두어야 합니다. 개인적으로는 하나의 변수를 여러 가지 용도(이 경우 찾은 항목과 검색 성공 여부)로 사용하는 것은 바람직하지 않다고 생각하며, 따라서 이러한 제약이 오히려 좋은 코딩 스타일을 권장하는 효과를 낼 것이라고 생각합니다. 여러분들은 어떠신지?

태그: C++ C++0x

comments powered by Disqus

예전 댓글(읽기 전용)