티스토리 뷰

우리는 함수를 사용함에 있어 사용자가 보기 편하도록 제작 할 의무가 있다.


언어를 공부하다보면


가장 처음 만드는 함수 이름은 항상 FOO(), BOO(), MOO()등일것이다. 


조금 더 지나면 영어 단어들을 조합하기 시작하고 


앞에 리턴값의 의미를 부여하여 int nGetStringSize() 같은 표기법을 활용한다. 


이제 함수의 파라미터,인자값 등을 선언 하기 시작하면서 


 int nGetStringSize()  -->  int nGetStringSize(TCHAR* Name , int NameSize ) 로 변경 할 것이며 


업무를 조금더 하다보면 


int nGetStringSize(TCHAR* szName , int nNameSize ) 처럼 점점 표기법을 완성 할 것이다. 


하지만 우리는 더 높을 곳을 바라 보아야 하며 좀 더 간지나는 코딩을 해야한다. 


즉, 매크로를 활용하여 사용자에게 좀 더 편하고 가독성이 높은 코드를 만들어 보자. 


기본 형식은  int GetStringSize(TCHAR* szName , int nNameSize )으로 하고 변경을 해보자 


우리가 항상 생각해야 되는것은 아래와 같다. 


1. RETURN 값을 표기하고 

2. 인자 값의 정확한 타입을 표기하고 

3. 인자 값과 내부 변수를 구별하고

4. 해당 인자 값을 어떻게 활용하는지 표기하고

5. 다들 무서워하는 "*"을 없애 버리자!!  


우선 1번 부터 해보자 


int GetStringSize(); 이렇게 하면 해당 함수는 int 형을 리턴하는 함수인것을 선언부 에서는 확인 할 수 있지만 

함수를 활용하는 곳에서는 어떤 타입으로 리턴 하는지 확인 할 수가 없다. 

int nGetStringSize(); 하면 어떨까 ?  "n"이라는 수식어를 붙여 사용하면 함수를 호출 하면서도 바로 알수 있지 않을까?

"n" 은 INT , "sz"는 String, Point 는 p를 활용하자... 


2번을 해봅시다. 

1번과 동일한 방법을 활용하는 것이다. 즉 함수 내부에서 함수의 인자값으로 들어온 값이 어떤 형태인지 확인을 빨리 하기 위해서 인자 값에서 해당 방식을 적용하는 것이다.

int nGetStringSize(TCHAR* Name , int NameSize )의 함수를 변경해 봅시다. 


int nGetStringSize(TCHAR* szName, int nNameSize) 로 변경 할 수 있습니다. Name이라는것이 sz를 활용하여 String인 것을 알 수 있습니다. NameSize는 UINT인자 INT 인지 Long 인지 n을 보고 INT 인것을 확인 할 수 있습니다. 

바로 이렇게 가독성을 높이는 것이 포인트 입니다. 


이제 3번을 해봅시다 .

int nGetStringSize(TCHAR* szName, int nNameSize)의 함수를 이용하여 작업을 하면 이런 결과가 나옵니다.

int nGetStringSize(TCHAR* _szName, int _nNameSize) 별반 차이가 없조?

"_"를 이용하여 이 변수는 함수 인자 값으로 받아온 변수라는 것을 확인 하는 것입니다. 어떠한 표기법도 좋지만

보통은 "_"를 활용 합니다. 

즉 함수 내부에 Name2이라는 변수가 있고 함수 인자 값이 Name 이면 두 변수의 차이는 이름 뿐 인자 값으로 넘어 온 값인지 내부에서 할당한 변수인지를 함수의 길이가 길어 질 수록 항상 확인 해야 합니다.  


4번!!  어리둥절 하실 껍니다. 저걸 어떻게 함수 선언부에서 하냐!! 이러시는 분들이 많으시겠조 하지만 해야 합니다. 

int nGetStringSize(TCHAR* _szName, int _nNameSize)이 함수에 Name을 복사하여 Buffer에 담는 함수라고 하고 인자를 추가해 봅시다.


예1)

int nGetStringSize(TCHAR* szName, int nNameSize, TCHAR* _szBuffer);


예2)

int nGetStringSize(TCHAR* szName, int nNameSize, TCHAR* _szOutPutBuffer);


예1 보다는 예2가 가독성이 훨씬 높습니다. Buffer의 의미가 정확하게 전달되기 떄문 입니다. 해당 인자 값에 OutPufBuffer에 해당하는 변수를 할당 한 다음에 넘기라는 뜻을 누구나 알 수 있습니다. 

그럼 좀 더!! 전문가적으로 만들어 봅시다!!

int nGetStringSize(__in TCHAR* szName, __in int nNameSize, __out TCHAR* _szOutPutBuffer);


__in

__out

__inout 


이것은 아무 의미 없는 NULL 매크로 입니다. C/C++ Standard 에서 제공 하고 있습니다. 

즉 표기만을 위한 매크로 입니다. 3가지 인자 값의 의미가 확실해 지겠조?

1번 인자는 내부에서 활용하는 변수이고 

2번 인자도 내부에서 활용하는 변수 입니다. 즉 함수가 종료 될거나 해당 값이 어떠한 값이 변경되어 오지 않는 다는 뜻입니다.

3번 인자는 어떠한 값이 해당 변수에 저장되어 나온다는 것입니다.


그럼 __inout은 어떨 때 쓸까요?


int nGetStringSize(__in TCHAR* szName, __in int nNameSize, __out TCHAR* _szOutPutBuffer, __inout
INT& _nOutPutBufferSize);


_nOutPutBufferSize는 _szOutPutBuffer의 사이즈를 넣어주는 변수 입니다. 그리고 내부에서 _szOutPutBuffer에 담긴 길이를 리턴할 수 있는 것입니다.


이렇게 많은 정보를 in,out, inout, "_" 등을 활용 하면 별도의 함수 주석이 필요 없을 정도로 많은 정보를 담을 수 있습니다. 



이제 가장 두려운 "*" 없애기 5번 입니다. 


TCHAR*, CHAR*, INT* 등 C/C++의 상징이자 넘사벽? 으로 알려진 POINT 입니다. 메모리 주소값이지요.

이것을 보기만 해도 헉구역질 나시는 분들이 있으십니다. 개발자는 아니지만 코드를 봐야 되시는 분들이 보통 그러시더라구요 

그래서 코드에서 과감하게 "*"을 없애고 시작하는 방식을 많이 사용합니다.


#Define 처리 되어 있는 변수를 활용하고 

Struct는 TypeDef를 이용하면 됩니다. 


INT*      =  PINT 

CHAR*  =  PSTR, LPSTR

TCHAR* = LPTSTR

VOID*    = PVOID  등을 이용하여 의미를 살아 있지만 * 이 않보이도록 하는 방법을 말합니다.


int nGetStringSize(__in TCHAR* szName, __in int nNameSize, __out TCHAR* _szOutPutBuffer);를 변경해보면 


int nGetStringSize(__in LPTSTR szName, __in int nNameSize, __out LPTSTR _szOutPutBuffer); 이 되겠고 

_szName의 활용에 따라서 


int nGetStringSize(__in LPCTSTR szName, __in int nNameSize, __out LPTSTR _szOutPutBuffer);이 되겠습니다. 


*이 않보이는 군요 .. 좋네요 


임의 struct는 아래와 같이 활용 합니다.


typedef struct _ST_INFO_

{

TCHAR szName[100];

UINT     nAge;

BOOL   bSex;

}ST_INFO, *pST_INFO;


이렇게 만들면 


선언 하실 때


일반 Stack 선언은 ST_INFO m_stPersonInfo;

동적 할당을 위한 선언은 PST_INFO m_pstPersonInfo = new ST_INFO;

이렇게 되겠조... 역시 * 이 없어 눈이 편안 합니다.



지금까지 설명한 모든것은 명령법 중에 카말과 울타리표기법등을 섞어서 사용하는 방법 입니다.

익숙한 방법이라 이해도 빠르 실것입니다.


어느것이 진리이고 어느것이 좋은 것은 없습니다. 

여러사람들이 코딩을 동시에 진행함에 있서 좀 더 배려 하고 나아가 나도 편하고 남도 편하게 볼 수 있는 코딩을 하자는게 취지 입니다. 


이상입니다.


댓글