EC++ 2. define 대신 const, enum, inline 쓰기

반응형

const에 대한 이야기
나는 싱글톤을 쓰면서 항상 아래와 같은 방식으로 설정했다.
#define  g_pDevice  MgDevice::GetInstance()
그래서 편리하게 g_pDevice를 마치 변수처럼 사용할 수 있었다.

하지만 이를 const로 바꾸면서 하나를 알게 되었다.
const MgDevice* const g_pDevice = MgDevice::GetInstance();
처음 생각은 이 클래스를 가리키는 g_pDevice 변수(define처럼 매크로가 아닌)는 값도
가리키는 클래스도 바뀌지 않고 주소도 바뀌지 않을 거라 생각해서
위와 같이 하였다.

const로 바꾸고자 했던 이유는 define는 기호 테이블에 이름이 들어가지 않으며
컴파일러에서도 에러체크를 해주기 때문이다.
게다가 define는 해당 매크로가 등장할 때 마다 선행처리자에 의해 모두 해당 값으로
바뀌면서 목적코드 안에 해당 값의 사본이 등장 횟수만큼 들어가지만 const는 아무리 여러번
쓰더라도 사본이 하나만 생긴다는 것이다.

잠시 이야기가 다른쪽으로 샌듯하지만 아무튼 위의 방식으로 선언해주면 에러가 난다.
즉, const로 만든 객체는 const로 선언된 멤버들만 사용할 수 있다는 조건이 있기 때문이다.
그래서 다시 아래와 같이 바꾸어 주어야 한다.
MgDevice* const g_pDevice = MgDevice::GetInstance();


enum에 대한 이야기
그리고 define를 자주 사용하던 경우중 하나가 배열의 크기값을 지정하기 위해서 였다.
#define MAX_USER 5
int m_iMaxUser[MAX_USER];

이런식으로 자주 코딩을 했었다.
이런 경우는 enum을 사용한 "enum hack"을 사용하면 좋다.

enum {E_MAXUSER = 5};
int m_iMaxUser[E_MAXUSER];

위의 방식의 핵심은 나열자의 값이 int로 활용 된다는 것에서 착안한다.
enum으로 정의함으로써 접근제어의 기능또한 지원받을 수 있고,
const나 define처럼 이 값을 변경을 막는 자물쇠역활까지 해주며,
쓸데없는 메모리 할당도 하지 않는다.
이렇게 enum은 지극히 실용적이다.

inline에 대한 이야기
define으로 자주 하는 짓이 간단한 함수를 만드는 것이다.
#define BIGGER(a,b) a > b ? a : b
그런데 여기서 자주 실수하는 부분이 있다.

int a=5, b=3;
int c =BIGGER(++a,b);
여기에서 결과가 a가 두번증가하여 7이 된다는 것이다.
아놔~ 짱난다...머지.ㅡㅡ;.
그래서 기존 define이 가지는 효율을 유지하면서 정규함수의
동작방식과 타입 안전성까지 지원하는 방법을 찾게되었고,
그게 바로 인라인 함수에 대한 템플릿이다.
template<typename T>
inline int Bigger(const T& left, T& right)
{
 return (left>right ? left:right);
}

int a=5, b=3;
int c = Bigger(++a, b);
이제 위 식의 결과가 제대로 나올 것이다.
이는 템플릿이기 떄문에 동일계열 함수군을 만들어 내며
define 함수처럼 괄호에 신경쓸 필요도 없고, 접근규칙도 지원이 된다.

'Study > C++' 카테고리의 다른 글

호출규약  (0) 2009.07.31
pascall stdcall cdecl  (0) 2009.07.31
How to Use __declspec(dllexport) in an MFC Extension DLL  (0) 2009.07.26
stl set  (0) 2009.07.23
bitarray 제작, 활용  (0) 2009.07.20
TAGS.

Comments