C/C++ 에서 #define 을 사용을 가급적 자제하도록 권고되고 있지만, 잘 사용할 경우 많은 코딩상의 이득을 볼 수 있습니다.
#define을 활용하는 예를 몇 가지 설명하려고 합니다.
우선 팁을 설명하기 전에 간단하게 ‘##’ 과 “#’ 에 대해 살펴보고 가겠습니다. (샘플소스는 MSDN 에서 가져왔습니다)
1. ‘##’ - Token-Pasting Operator (##): 분리되어 있는 2개의 토큰을 하나로 뭉쳐주는 역할을 합니다.
#define paster( n ) printf( "token" #n " = %d", token##n )
라고 할 때 아래와 같은 코딩은
다음과 같이 풀이되어 결국 ‘token9 = 9’ 가 화면에 표시되게 됩니다.
printf( "token" "9" " = %d", token9 ); → printf( "token9 = %d", token9 );
이와 같이 ## 은 왼쪽 Operand 와 오른쪽 Operand를 접착제처럼 붙여 주는 역할을 합니다.
2. ‘#’ - Stringizing Operator (#): 매크로 인자를 문자열로 만드는 역할을 합니다.
#define stringer( x ) printf( #x "\n" )
과 같이 정의 할 경우 아래와 같은 문장은
stringer( In quotes in the printf function call\n );
다음과 같이 풀어쓰게 됩니다.
printf( "In quotes in the printf function call\n" "\n" );
이제 #define 매크로를 이용한 활용예를 들어 보겠습니다.
1. 배열의 크기 구하기
#define 을 이용하는 가장 간단하고 자주 쓰이는 팁이 아닐까 생각됩니다.
이를 이용한 간단 샘플입니다.
물론
i < arrayCnt(ListCol)
를 사용하지 않고
i < sizeof(ListCol) / sizeof(ListCol[0])
을 사용해도 되지만 이와 같은 작업을 여러 번 반복할 경우(array 를 사용하는 경우는 정말 흔하디 흔하죠) 단조로운 코딩이 반복될 수 있어 #define 을 이용한 매크로를 애용하고 있습니다.
2. Get/Set 함수 간단하게 만들기
OOP(Object Oriented Programming)로 프로그램 할 경우 멤버 변수의 Get 함수와 Set 함수를 만들어야 할 경우가 많습니다. 변수를 외부로 드러내지 않고 변수에 대한 접근 Method 만 제공함으로써 추후 변경에 대한 유지보수를 최소화하기 위해 많이 사용하게 되는데요(OOP 의 특징 중에 하나인 Encapsulation). 간단한 Get/Set 함수라 하더라도 하드코딩일 경우 손이 많이 가게 됩니다. 이럴 경우 #define 매크로를 사용하면 단순반복적인 Get/Set 함수를 한 줄만으로 코딩하여 작성할 수 있습니다.
예를 들어 다음과 같은 매크로를 정의한 경우
bool m_bTest 을 Get 하고 Set 하는 간단한 함수는 아래 한 줄로 만들 수 있게 됩니다.
위 한 줄의 매크로는 자동으로 전 처리기에 의해 컴파일 시 다음과 같은 함수로 확장됩니다.
간단하지 않은가요 ^^.
외부로 공개해야 하는 속성이 많으면 많을수록 코딩부담을 줄이고, 미스타이핑으로 인한 오류를 사전에 막아 줄 수 있어 매크로는 더욱 위력을 발휘하게 됩니다.
사실 마이크로소프트의 ATL 3.0 라이브로리 소스 헤더를 분석해 보면 이와 같은 매크로를 훨씬 복잡하게 사용하고 있다는 걸 알 수 있습니다.
아래 샘플은 ATL 3.0 라이브러리 ATLCTL.H 소스에 있는 코드입니다.
끝으로, 이와 같은 #define 매크로의 단점도 잠시 언급하면
- 디버깅이 힘듭니다. 디버깅 시 매크로의 경우 확장된 소스가 보여지지 않아 변수의 변경사항을 추적해 들어 가기가 힘듭니다. 매크로가 복잡할 경우 애로가 있을 수 있어 복잡한 함수의 경우는 위와 같은 방식을 취하지 않는 편이 좋습니다.
- #define MAX_CUSTOMER 10 보다는 const int MAX_CUSTOMER = 10 으로 코딩 하는 것이 변수가 잘못 typecasting 되는 걸 막을 수 있는 좋은 코딩 습관입니다. 사실 이 부분 때문에 #define 매크로사용을 자제해야 한다고 권장한다고 봐야겠죠.
'컴퓨터공학 기초 > C.C++' 카테고리의 다른 글
gcc/g++ 특정 워닝 제거 방법 (0) | 2014.07.05 |
---|---|
윈도우 도스(콘솔) 글자색 배경색 지정하기 (2) | 2014.02.10 |
#define 매크로 설명 (0) | 2013.07.19 |
#define 매크로 예제 (0) | 2013.07.19 |
코드 실행 시간 측정 방법 정리 (0) | 2013.05.16 |