* 헝가리언 표기법(Hungarian notation)
10, 15년 전 Microsoft의 개발자 중 헝가리 사람의 프로그래머가 쓰던 변수 명명법. MS내부에서 따라 쓰기 시작하던 것이 점차 전세계의 프로그래머들에게 널리 퍼져 이젠 프로그램 코딩 시 변수 명명의 표준적인 관례가 되었다. 그러나 실제로 현장에서 일하다 보면 헝가리언 표기법을 제대로 지키는 개발자는 그리 많지 않다. 어느 정도 개발 경험을 가지고 있는 프로그래머는 물론 심지어 시중의 프로그래밍 서적에서 조차 저자마다 변수명을 개인에 따라 가지각색으로 짓고 있어서 처음 프로그램을 배우는 입문자들이 변수 명명에 대한 기준을 제대로 잡지 못하고 있는 실정이다. 솔직히 필자도 얼마전까지 이런 변수 명명에 대한 관례를 잘 지키지 않았다. 그러나 변수 명명에 관한 표준화된 관례를 지켜주면 코드의 가독성을 높여줄 뿐 아니라 예를 들어 카운터 변수를 count라고 지을지 cnt라고 지을지 고민하지 않아도 되는 편리함을 누릴 수 있다.
------------------------------------------------------------------------------
x_xXxxxxxx
0123456789
0: 변수의 위치를 지정한다. g(전역변수), m(멤버변수), 없음(지역변수)
1: 0 위치에 g나 m을 지정한 경우 _을 기술한다.
2: 자료형의 종류를 나타낸다.
n, i:
l: long 형
u: 부호 없는
w: 부호 없는 2 byte
dw: 부호 없는 4 byte
p: 포인터 타입
f, d: 실수형(f는 float, d는 double)
sz: char 배열(문자열 표현)
클래스 이름에 대해서는 관습적으로 자음 축약형을 사용한다.
3~: 변수의 의미 있는 이름을 기술하며, 3 위치는 대문자를 사용한다. 변수 이름이 너무 긴 경우 자음만을 기술한다. 예) g_nCnt
Prefix |
Type |
Description |
Example |
b |
bool |
any Boolean type |
bool bTrue; |
c |
char |
character type |
char cLetter; |
i |
int |
integer |
int iCars; |
l |
long |
long type |
long lDistance; |
u |
unsigned |
unsigned type |
|
f |
float |
floating point |
float fPercent; |
d |
double |
double floating point |
|
s |
static |
a static variable |
static short ssChoice; |
rg |
array |
stands for range |
float rgfTemp[16]; |
p |
* |
any pointer |
int *piAddr; |
sz |
* |
null terminated string of characters |
char szText[16]; |
pfn |
* |
function pointer |
int (*pifnFunc1)(int x, int y) |
t |
structure |
a user defined type |
|
e |
enumeration |
variable which takes enumerated value |
|
E |
enumeration |
Enumerated type |
|
g_ |
global |
global variable |
String *g_psBuffer; |
m_ |
member |
class private member variable |
|
k |
constant formal parameter |
|
void vFunc(const long klGalaxies) |
r |
reference formal parameter |
|
void vFunc(long &rlGalaxies) |
str |
string |
string class(c++) |
String strName; |
prg |
dynamically allocated array |
|
char *prgGrades; |
h |
handle |
handle to something |
hMenu |
n |
|
number, quantity |
int nNum; |
x/y |
|
used as size |
int xWidth, yHeight; |
Example of type specific variable naming
unsigned char ucByte; : 한 바이트 데이터
char cChar; : 한 문자
unsigned char rgucByte[10]; : 바이트 데이터 10개
char rgcChar[10]; : 문자 데이터 10개
char szChar[16 + 1]; : 문자 16개를 저장할 수 있는 문자열 공간
Data type |
Description |
BYTE |
unsigned char type |
WORD |
unsigned short type |
DWORD |
unsigned long type |
클래스와 변수 등 우리가 프로그램을 하면서 많은 것에 이름을 붙이는 작업을 하게 됩니다. 이 때, 명명 규칙을 사용하면 일괄된 코드를 작성할 수 있어 향후 유지보수에 큰 이점을 가지게 됩니다. 이에 Microsoft에서는 명명규칙에 대한 권고사항을 두고 있습니다.
우선 명명 규칙에 사용되는 이름규칙 종류를 보면,
파스칼(Pascal)이라는 방식이 있습니다. 이는 구분되는 단어를 대문자로 연결하는 방식입니다.
파스칼(Pascal) – 구분되는 단어를 대문자로 시작(class, namespace, functions, property 등), 파스칼에 대표적인 예가 바로 namespace와 class function이 되겠습니다.
그래서 namespace를 표시할 때, Hanbroz.OfficeClient.Web과 같이 명명합니다.
Tip > namespace에는 별도의 명명규칙이 있습니다. 보통 회사명, 솔루션명, 제품명, 타입 등으로 주게 되는데 만약 Microsoft에서 Office Excel 관련 Web project라면 Microsoft.Office.Excel.Web과 같은 형식의 이름을 사용하게 됩니다.
또, 카멜(Camel)이라는 방식이 있습니다. 이는 구분되는 단어를 Pascal과 같이 대문자로 표기하고 맨 처음 단어를 소문자로 적는 방식입니다.
카멜(Camel) – 구분되는 단어를 대문자로 시작하되 맨 앞 문자는 소문자(variable, parameter 등), 카멜의 대표적인 예는 매개변수입니다. 매개변수라고 하면 함수에 들어가는 변수를 이야기하죠.
예를 들면,
public void MyName(String myName) {...}
와 같습니다.
마지막으로 헝가리언 표기법(Hungarian notation)이 있습니다. 엄밀하게 이야기하면 이것은 위의 규칙과는 조금 다른데 형식 + 변수 타입 식으로 기술하는 방식입니다. 가장 대표적인 것이 control의 이름을 붙일 때 주로 사용합니다.
textbox의 경우 txtMyName과 같이 이 control이 textbox라는 것을 접두사에 붙이는 방식입니다.
이 같은 방식의 명명은 폭넓게 사용되는데 예를 들면 전역변수의 경우 _을 붙이는 경우입니다.
이렇게 헝가리언 표기법을 사용하게 되면 VS툴의 인텔리센스에서 해당되는 control이나 변수를 쉽게 찾을 수 있어서 많은 이점을 가지게 됩니다.
이런 것을 VS에서 interface를 명명하는 방식에도 사용됩니다. interface에는 앞에 대문자 I를 붙여 이것이 interface라는 것을 나타내는 것으로 사용되기도 합니다. project를 하다 보면 많은 분들이 일관되지 않은 명명규칙을 사용해서 code를 보기 힘든 경우가 많습니다. 꼭 권고사항이 아니라고 해도 자신 혹은 회사 내에 명명규칙을 마련하고 이를 준수하는 것이 project에 많은 도움이 될 것입니다.
정리하자면,
1. namespace, class, property, function(method)에는 파스칼(pascal)
Hanbros.SmartClient.Controls
Hanbros.Samsung.SmartClient.Web
public class MyClass() {...}
2. variable, parameter 등에는 카멜(camel)
public class MyClass(string myName) {...}
3. control에는 해당 control에 접두사를 붙이는 헝가리언 표기법을 사용
string _mtName;
protected System.Web.UI.WebControls txtMyName;
4. namespace는 회사명.solution명.제품명.type을 사용
Microsoft.Office.Excel.Web
5. 줄인 단어는 모두 대문자를 사용
public void GetMyID() {...}
6. 가능/불가능은 Enable을 붙여서 사용
public bool EnableWrite() {...}
7. ~이다/아니다는 Is를 붙여서 사용
public bool IsExist() {...}
8. 값을 얻는 이름은 Get, 값을 쓰는 이름은 Set
public Datatable GetMyBoards() {...}
9. 중간 단어에 _ 사용은 자제
public class My_Class() {...} (X)
10. 인터페이스에는 I를 사용
IRunable
11. 사용자 예외처리 class 경우 접미사에 Exception을 붙인다.
public class MyApplicationException():ApplicationException {...}
물론 이것은 권고사항입니다. 저도 Microsoft의 권고사항을 모두 따르고 있지는 않습니다. 중요한 것은 개인이나 회사에서 정한 명명규칙이 있어야 보다 명확한 코드가 가능하다는 것입니다. MSDN 도움말에서 “명명규칙”으로 검색하시면 더 자세한 내용을 보실 수 있습니다.
(MSDN)
공식적인 명명 규칙은 여러 가지가 있으며 이들 각각의 규칙은 고유의 adherent와 detractor를 가집니다. 기존 규칙 중 하나를 그대로 사용하거나 자신만의 규칙을 만들 수 있습니다. 단, 다른 Office 개발자도 쉽게 파악할 수 있는 몇 가지 규칙을 채택하여 일관성 있게 적용해야 합니다.
적어도 변수 형식(개체 변수, 컨트롤 변수 및 데이터 형식), 변수 범위, 상수 및 프로시저를 식별하여 구분할 수 있는 명명 규칙을 사용하는 것이 좋습니다. 또한 이해하기 쉽고 사용하기가 편리해야 합니다.
(출처: http://blog.naver.com/darkyeon/70013799619)
'C, C++ 문법' 카테고리의 다른 글
DLL - 함수 호출시 __declspec(dllimport)의 사용과 미사용간 코드생성 차이점 (0) | 2008.09.02 |
---|---|
__declspec( selectany ) declarator (0) | 2008.09.02 |
#undef THIS_FILE ...이게 먼가여? (0) | 2008.09.01 |
문자열(스트링) 전격 분석 (0) | 2008.09.01 |
논리상 생성자에서 처리해도 되는 것을 Init 함수를 따로 빼서 사용하는 이유 (0) | 2008.08.27 |
C++ 심화학습 (0) | 2008.07.29 |
Win32 아키텍처 완전 해부 ? (0) | 2008.07.27 |