C++ 프로그래밍

C++ 람다를 활용하여 함수 내 중복 코드 줄이기

하늘흐늘 2022. 3. 23. 15:18
반응형

람다는 정말로 활용하면 할수록 유용한 기능인 듯합니다. 막상 활용하기 시작하니 람다 없던 시기의 코드에 비하여 코드의 양도 줄어들고 코드도 이해하기가 더 쉬워지는 듯 합니다. 이 글에서는 람다를 활용하여 함수내 중복 코드를 제거하는 예를 살펴보겠습니다. 

아래 코드는 제가 작성한 코드로 실제 프로젝트에서 흔희 볼 수 있는 반복적인 코드입니다. 코드 내용은 중요하지 않으니 형태만 참고하시면 됩니다.

switch (nSBCode)
{
case SB_LINEUP:
	pScrollBar->SetScrollPos(pScrollBar->GetScrollPos() - 1);
	if (chartUse_.test(IDX_CHART_SUB)) chartSub_->ScrollX(pScrollBar->GetScrollPos());
	if (chartUse_.test(IDX_CHART)) chart_->ScrollX(pScrollBar->GetScrollPos());
	if (chartUse_.test(IDX_CHART_VOLUME)) chartVolumn_->ScrollX(pScrollBar->GetScrollPos());	
	break;

case SB_LINEDOWN:
	pScrollBar->SetScrollPos(pScrollBar->GetScrollPos() + 1);
	if (chartUse_.test(IDX_CHART_SUB)) chartSub_->ScrollX(pScrollBar->GetScrollPos());
	if (chartUse_.test(IDX_CHART)) chart_->ScrollX(pScrollBar->GetScrollPos());
	if (chartUse_.test(IDX_CHART_VOLUME)) chartVolumn_->ScrollX(pScrollBar->GetScrollPos());
	break;

case SB_PAGEUP:
	pScrollBar->SetScrollPos(pScrollBar->GetScrollPos() - pageMove);
	if (chartUse_.test(IDX_CHART_SUB)) chartSub_->ScrollX(pScrollBar->GetScrollPos());
	if (chartUse_.test(IDX_CHART)) chart_->ScrollX(pScrollBar->GetScrollPos());
	if (chartUse_.test(IDX_CHART_VOLUME)) chartVolumn_->ScrollX(pScrollBar->GetScrollPos());
	break;
...

이 코드는 반복적인 부분이 많습니다. 코드의 반복을 줄이기 위하여 오래전 C 스타일을 많이 가지고 있던 C++ 시기의 코드라면 #define을 이용하여 반복을 줄일 수 있을 것입니다. #define은 형안전성에 대한 문제나 예외시 컴파일 오류 잡기가 어려워 요즘은 필요시에만 최소한으로 사용할 것이 권장되고 있습니다.

만약 리팩토링이 이슈화 되기 시작한 이후 스타일로 작성한다면 코드를 완전한 외부 함수로 뽑아내는 식으로 수정할 수 있을 것입니다. 그런데 외부 함수로 뽑아내는 것도 한 일입니다. 

이럴 때 람다를 이용하여 함수 내의 내부 함수를 정의하고 사용하면 반복적인 코드를 줄여 수정시 오류 가능성을 줄이면서 수정을 최소화할 수 있고 또한 내부 함수는 함수내에 있어 코드를 참고하기도 편해집니다.

아래는 람다를 이용하여 코드를 수정한 예입니다.

auto func_scroll = [&](int pos) {
	pScrollBar->SetScrollPos(pos);
	if (chartUse_.test(IDX_CHART_SUB)) chartSub_->ScrollX(pScrollBar->GetScrollPos());
	if (chartUse_.test(IDX_CHART)) chart_->ScrollX(pScrollBar->GetScrollPos());
	if (chartUse_.test(IDX_CHART_VOLUME)) chartVolumn_->ScrollX(pScrollBar->GetScrollPos());
};

switch (nSBCode)
{
case SB_LINEUP:
	func_scroll(pScrollBar->GetScrollPos() - 1);
	break;

case SB_LINEDOWN:
	func_scroll(pScrollBar->GetScrollPos() + 1);
	break;

case SB_PAGEUP:
	func_scroll(pScrollBar->GetScrollPos() - pageMove);
	break;
...

 

반응형