코드 컨벤션 정리.
낙타 케이싱, 파스칼 케이싱, 헝가리안 표기법
- by Tapitolife
그냥 거두절미하고 여기 첫 번째 포스팅에서는 변수 표기법에 대해 정리해 보았습니다.
▶ 변수명 표기법
상용 프로그램 하나 만들기 위해서 보통 여러 명의 개발자가 수 백만 라인의 코드를 작성합니다.
이 때 개발자들은 필요에 따라 변수, 상수, 함수 등을 선언합니다. 그런데 이때 문제가 생깁니다.
▶ 첫 번째 문제 상황 – 데이터 형의 혼란
개발자 여럿이 모여 수백만 라인의 코드를 작성하다 보면 자연스럽게
수 많은 변수/함수들이 선언됩니다. 이 때 그것들을 사용함에 있어 혼돈의 소지가 있습니다.
"지금 이게 전역 변수였나?", "지금 이 변수가 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
'Programming Language > C&C++' 카테고리의 다른 글
소켓 통신 #2 - AF_INET 사용하기 (2) (0) | 2014.09.19 |
---|---|
소켓 통신 #2 - AF_INET 사용하기 (1) (0) | 2014.09.19 |
소켓 통신 #1 - 소켓 통신에 쓰이는 구조체 (2) | 2014.09.19 |
C++11에서 추가된 클래스 - thread (0) | 2014.04.17 |
C언어 표준 문자열 관련 함수 – ANSI, Wide Char별 함수 이름 정리 (0) | 2011.02.14 |