C, C++ 문법

* 헝가리언 표기법(Hungarian notation)

디버그정 2008. 8. 27. 02:30

* 헝가리언 표기법(Hungarian notation)

 

 10, 15 Microsoft 개발자 헝가리 사람의 프로그래머가 쓰던 변수 명명법. MS내부에서 따라 쓰기 시작하던 것이 점차 전세계의 프로그래머들에게 널리 퍼져 이젠 프로그램 코딩 변수 명명의 표준적인 관례가 되었다. 그러나 실제로 현장에서 일하다 보면 헝가리언 표기법을 제대로 지키는 개발자는 그리 많지 않다. 어느 정도 개발 경험을 가지고 있는 프로그래머는 물론 심지어 시중의 프로그래밍 서적에서 조차 저자마다 변수명을 개인에 따라 가지각색으로 짓고 있어서 처음 프로그램을 배우는 입문자들이 변수 명명에 대한 기준을 제대로 잡지 못하고 있는 실정이다. 솔직히 필자도 얼마전까지 이런 변수 명명에 대한 관례를 지키지 않았다. 그러나 변수 명명에 관한 표준화된 관례를 지켜주면 코드의 가독성을 높여줄 아니라 예를 들어 카운터 변수를 count라고 지을지 cnt라고 지을지 고민하지 않아도 되는 편리함을 누릴 있다.

 

------------------------------------------------------------------------------

 

x_xXxxxxxx

0123456789

 

0: 변수의 위치를 지정한다. g(전역변수), m(멤버변수), 없음(지역변수)

1: 0 위치에 g m 지정한 경우 _ 기술한다.

2: 자료형의 종류를 나타낸다.

 n, i: 수형(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)