더북(TheBook)

6.1.5 매크로 함수를 이용한 코드 간소화

앞으로 설명할 대부분의 영상 처리 메뉴 이벤트 처리기 추가 시에 소스 6-3과 같은 형식을 따르게 될 것이다. 이 경우 영상 처리 함수를 호출하기 전과 후에 나타나는 영상 클래스 변환 코드들은 거의 항상 동일할 것이다. 그러므로 약간의 프로그래밍 테크닉을 동원하여 소스 코드를 조금이나마 간결하게 바꿔보려고 한다. 일단 이 책에서 사용할 대부분의 영상 처리 메뉴 이벤트 처리기 함수는 아래와 같은 형식을 따를 것이다.

IppByteImage img;
IppDibToImage(m_Dib, img);

// 영상 처리 함수 호출

IppDib dib;
IppImageToDib(img, dib);

// 출력창 표시 및 결과 영상 보여주기

위에서 주석으로 표시한 부분을 제외한 영상 변환 관련 코드들은 항상 동일한 형태를 따를 것이다. 이 변환 코드들이 항상 네 줄씩 차지하게 하는 것도 조금은 낭비같이 보인다. 그러므로 #define 구문을 이용하여 각각의 변환 코드를 한 줄의 매크로 형태로 변경하려고 한다. 예를 들어 IppDib 클래스를 IppByteImage 형태로 변환하는 두 줄의 코드를 #define 문으로 정의하면 아래와 같다.

#define CONVERT_DIB_TO_BYTEIMAGE(m_Dib, img) \
    IppByteImage img; \
    IppDibToImage(m_Dib, img);

위와 같이 정의하면 img 변수 선언 및 IppDibToImage 함수 호출을 한 줄로 표현할 수 있다. 영상 처리 작업 후, 다시 IppByteImageIppDib로 변환할 때의 동작도 마찬가지 형태로 #define 문으로 정의할 수 있다. 이처럼 영상 변환 코드를 매크로로 변환하여 다시 작성한 OnImageInverse 함수를 소스 6-4에 나타내었다.

소스 6-4 매크로를 이용한 반전 메뉴 이벤트 처리 함수(ImageToolDoc.cpp)
#define CONVERT_DIB_TO_BYTEIMAGE(m_Dib, img) \
    IppByteImage img; \
    IppDibToImage(m_Dib, img);

#define CONVERT_IMAGE_TO_DIB(img, dib) \
    IppDib dib; \
    IppImageToDib(img, dib);

void CImageToolDoc::OnImageInverse()
{
    CONVERT_DIB_TO_BYTEIMAGE(m_Dib, img)
    IppInverse(img);
    CONVERT_IMAGE_TO_DIB(img, dib)

    AfxPrintInfo(_T("[반전] 입력 영상: %s"), GetTitle());
    AfxNewBitmap(dib);
}

소스 6-4의 OnImageInverse 함수 본문이 앞서 설명한 소스 6-3의 OnImageInverse 함수보다 훨씬 간략하게 변경되었다. 게다가 매크로 이름만 봐도 무슨 동작을 하는지 쉽게 알 수 있을 것이다. 앞으로 나오는 모든 영상 처리 메뉴 이벤트 처리 함수에서는 소스 6-4와 같이 매크로 함수를 이용하여 소스 코드를 구성할 것이다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.