본문 바로가기

Programming Language/C&C++

코드 컨벤션 정리 – 낙타, 파스칼, 헝가리안

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

코드 컨벤션 정리.
낙타 케이싱, 파스칼 케이싱, 헝가리안 표기법

- by Tapitolife


좋은 프로그래밍 습관을 만들기 위해 총 2편으로 좋은 코드 컨벤션을 정리 해 보았습니다.
그냥 거두절미하고 여기 첫 번째 포스팅에서는 변수 표기법에 대해 정리해 보았습니다.

▶ 변수명 표기법
상용 프로그램 하나 만들기 위해서 보통 여러 명의 개발자가 수 백만 라인의 코드를 작성합니다.
이 때 개발자들은 필요에 따라 변수, 상수, 함수 등을 선언합니다. 그런데 이때 문제가 생깁니다.

▶ 첫 번째 문제 상황 – 데이터 형의 혼란
개발자 여럿이 모여 수백만 라인의 코드를 작성하다 보면 자연스럽게
수 많은 변수/함수들이 선언됩니다. 이 때 그것들을 사용함에 있어 혼돈의 소지가 있습니다.
"지금 이게 전역 변수였나?", "지금 이 변수가 BOOL 형이던가? int 형이던가?"
뭐 이런 문제가 발생하게 되죠.

▶ 두 번째 문제 상황 – 변수/상수/함수의 용도 혼란
다른 개발자가 만든 코드를 분석하다가 중간에 myInteger라는 변수를 발견합니다.
"어, 이게 뭐지? Integer가 있는 거 봐서 int같은데 도대체 어디에 쓰이는 변수이지?"
또 다른 경우로 int a; 이렇게 선언된 변수 또한 그 용도를 알 수 없게 합니다.

▶ 세 번째 문제 상황 – 너무 길어서 생기는 혼란

변수의 이름이 예를 들어 int running_time_of_windows_operating_system; 이렇게 되어있다고
가정합니다. 네. 변수의 이름이 문장이거나 긴 어구인 경우입니다.
이 때에는 화면에서 이 것을 읽기 위해 좁은 코딩 화면일 경우 좌우로 스크롤해가며
읽어야 하기도 하지만 무엇보다도 인텔리센스를 지원하지 않는 IDE에서
수 십만 라인을 작성하는데 이것을 직접 타이핑 하기도 벅차다는 문제도 있습니다.

▶ 변수, 상수, 함수 명명법의 통일
이런 문제는 심지어 자신이 작성한 코드조차도 시간이 지나고 다시 해석하는데
난해하게 할 수 있습니다. 그래서 변수, 상수, 함수를 명명하는데 있어 일정한 규칙을 둡니다.
명명법은 회사마다 다르고, 또 개인의 습관에 따라 다르지만 가장 보편적으로 이용되는
3가지 표기법. 바로 낙타 케이싱, 파스칼 케이싱, 헝가리안 표기법에 대해 정리합니다.

1. 낙타 케이싱(camelCasing)
낙타 표기법은 두 개 이상의 단어로 이루어진 변수 이름에서 첫 단어는 소문자로 시작하되,
나머지 단어는 모두 대문자로 시작하는 방식을 말합니다.
모양이 낙타 혹과 같다 해서 낙타 케이싱(camelCasing)이라 이름 붙여진 방식입니다.
예) int numbersOfMembers, timeElapsed, timeLeft 등

2. 파스칼 케이싱(PascalCasing)
파스칼 케이싱은 낙타 케이싱과 달리 첫 단어부터 대문자를 씁니다.

예) int NumbersOfMembers, TimeElapsed, TimeLeft 등

3. 헝가리안 표기법(Hungarian Notation)
이 표기법은 변수명에 변수의 타입을 명시하는 방식입니다.
주로 Windows API에서 사용하는 방식이고 이 방식을 처음 제안한 개발자가 DOS 초기 버전을
사용하던 아주 먼~ 먼~ 옛날(MSDN의 표현을 빌리자면 --;;) Charles Simonyi라는
헝가리 출신의 Microsoft 직원이었기 때문에 헝가리안 표기법이라는 이름이 붙었습니다.

변수의 타입은 아래와 같은 규칙을 갖습니다.

[접두어]태그[기본이름[접미어]]의 형식을 갖습니다.

② 접두어에는 다음과 같은 표시가 올 수 있습니다.

g_ 

전역변수

extern int g_iMax;

m_ 

멤버변수

private: int m_iMax;

(없음)

지역변수

int max;

③ 태그에는 다음과 같은 표시가 올 수 있습니다.

a

배열

const int* aArray;

b

BOOL형 변수

BOOL bErased;

by 

BYTE형 변수

BYTE byParity;

c 

배열의 원소 수를 나타내는 변수

size_t cCharCount;

ch 

CHAR형 변수

CHAR chCode;

cx, cy 

x, y의 길이를 나타내는 변수

int cx = 0;

d 

날짜형 변수

time_t dDate;

dbl 

double형 변수

double dblRate;

e

enum형 변수

MyEnum eEnum;

f

float형 변수

float fRate;

h 

HANDLE형 변수

HANDLE hWnd;

n 또는 i

INT형 변수

int nMax;

l 

LONG형 변수

LONG lLength;

p 

근거리 포인터(Win16에만 유효)

near int * pInteger;

lp

원거리 포인터

far int * lpInteger;

pfn

함수 포인터

FARPROC pfnProc;

rg

고정 크기 배열

WORD rgwArray[128];

prg

동적 할당 배열

WORD * prgwArray;

s

정적 변수

static int sInteger;

sz

NULL로 끝나는 문자열

CHAR szTest[128];

t

구조체형 변수

MyStruct tStruct;

u

UINT형 변수

UINT uType;

w

WORD형 변수

WORD wType;

dw

DWORD형 변수

DWORD dwLength;

str

CString형 변수

CString strTest;

k

const형 매개변수

const char kcChar

r

reference형 매개변수

int& riInteger

④ 기본 이름의 첫 글자는 대문자로 시작합니다.

⑤ 접미어는 추가적인 의미를 부여하며
First(처음), Last(끝), Lim(제한 값), Mac(인덱스 변수), T(임시 변수) 등등을
자유롭게 붙일 수 있습니다.

▶ 이런 규칙을 적용함으로써 얻을 수 있는 이점?
별 거 없습니다. 단지 "가독성"을 위한 겁니다.
소스를 자신 외의 다른 사람이 읽기에도 불편함이 없게 하기 위함입니다.

 

여기까지 읽어 주셔서 감사합니다.
다음에는 좋은 코딩습관 & 나쁜 코딩습관에 대해 정리하겠습니다.


참조:

Hungarian Notation: http://msdn.microsoft.com/en-us/library/aa260976(VS.60).aspx