내가 아는 익숙한 for문과는 for문을 보았기에 이를 기록하려 한다...!


일반적인 for문

 

남들에게는 일반적인 게 아닐 수 있지만 내가 프로그래밍을 하면서 보았던 코드들에서 대부분 for문은 다음과 같은 형태로 구현되어 있었다.

#include <iostream>

using namespace std;

int main()
{
	int arrayTest[10] = { 1,2,3,4,5,6,7,8,9,10 };

	for (int i = 0; i < 10; i++)
	{
		cout << arrayTest[i] << endl;
	}

	return 0;
}

정말 교과서에 나오는 정석적인 for문이다...! 이렇게 생긴 코드를 대부분의 C/C++ 개발자들이 제일 처음 본 반복문이라고 나는 생각한다.


auto 키워드를 활용한 for문

 

주말에 프로그래밍 공부를 조금씩 하다가 발견한 for문이다. 정말 너무 간결하고 nice해서 충격을 먹고 포스팅을 한다.

#include <iostream>

using namespace std;

int main()
{
	int arrayTest[10] = { 1,2,3,4,5,6,7,8,9,10 };

	for (auto element : arrayTest)
	{
		cout << element << endl;
	}

	return 0;
}

for문 첫 줄이 엄청나게 간결해졌다...!! 기존의 for문과 한번 비교 분석을 해보자!

 

우선 첫 번째로 당연히 코드가 간결해지고 코드 작성 시간이 줄어들게 되었다. 이전 코드는 은근히 코드를 작성하면서 기호를 추가하는 경우 끊김이 생기곤 했는데 위처럼 작성하는 경우엔 콜론 하나만 있으니 금방 타이핑을 할 수가 있었다. 두 번째로는 주어진 배열의 길이를 자동으로 for문이 가지게 된다는 점이다. for문을 작성할 때 항상 고민이었던 점은 배열을 사용하는 경우 for문에 해당 배열의 끝 지점이 어디인지 반드시 알고 있어야 했고 이를 잘못 지키는 경우 코드가 제대로 동작하지 않았다. 그래서 항상 어떻게 배열의 길이를 전달해줄까 고민하곤 했는데 이제 이런 고민을 할 필요는 없어졌다.

 

당연히 장점만 있는 것은 아닐 것이다. 바로 직전의 코드처럼 작성한다면 element에 매번 배열의 값이 복사된다. 이는 성능 하락의 주범이 될 수도 있겠다. 언제나 복사는 덜할수록 좋은 것 같다. 그리고 아직 검증은 안 해봤지만 저러한 작성 방식도 openMP가 적용되는지 의문이다. 이건 내일 회사 가서 한번 적용해서 돌려봐야겠다.

 

참고로 복사를 막는 방법으로 구현한 것은 아래와 같다. 참조 연산자를 사용하면 매번 복사하지 않고 수행시킬 수 있게 된다!

#include <iostream>

using namespace std;

int main()
{
	int arrayTest[10] = { 1,2,3,4,5,6,7,8,9,10 };

	for (auto& element : arrayTest)
	{
		cout << element << endl;
	}

	return 0;
}

오랜만에 최신 문물을 접한 느낌으로 충격을 받았다. 기존과 성능 차이가 꽤 있을지는 모르겠지만 적어도 코드가 간결해질 수 있어서 너무 좋은 것 같다. 혹시나 추가 설명이 필요하다면 아래 글을 참고하자!

 

 

Range-based for loop (since C++11) - cppreference.com

Executes a for loop over a range. Used as a more readable equivalent to the traditional for loop operating over a range of values, such as all elements in a container. [edit] Syntax attr(optional) for ( init-statement(optional)range-declaration : range-exp

en.cppreference.com

 

+ Recent posts