3.4.2 네이밍 컨벤션
이름을 정하는 데 많은 시간이나 상상력이 꼭 필요한 것은 아니다.
일반적인 경우에 쉽게 적용할 수 있는 표준적인 네이밍 방법이 있으면 편리하다.
3.4.2.1 카운터
프로그래밍을 시작할 때 많은 코드에서 i를 반복문의 카운터 변수로 활용하는것 을 보았을 것이다.
습관적으로 변수 i와 j를 각각 바깥 루프와 안쪽 루프의 카운터 변수로 사용할 수 있다.
하지만 중첩된 루프에서는 i와 j의 형상이 비슷함으로 변수를 혼동하기 쉽다.
그럼으로, 좀더 명확한 이름을 사용하고 루프 변수에 i와 j를 쓰는게 별로 좋지 않을 수 있다.
3.4.2.2 접두사
많은 프로그래머가 변수명을 정할 때 변수의 타입이나 사용법을 암시하는 접두사를 붙인다.
그런데 마찬가지라 많은 수의 프로그래머가 유지보수 문제 때문에 접두사의 사용을 꺼린다.
예를들어 어떤 static멤버 변수의 이름을 static을 의미하는 접두사를 붙여서 정했다고 하자.
나중에 코드를 수정하면서 그 변수가 non-static으로 변경되었다면, 그 변수가 사용된 모든 코드에서 접두사를 바꾸어야 한다. 이러한 작업은 많은 시간이 소요되기 떄문에 대부분의 프로그래머는 이러한 상황을 꺼린다.
만약 애초부터 접두사를 사용하지 않았다면 코드가 변경되면서 변수명까지 바꾸어야 할 상황이 줄어들게 된다.
변수명을 바꾸지 않고 그대로 둔다는 것은 일견 편해보이지만, 실질적으로 변수의 이름이 그 실제 의미를 반영하지 못하고 있는것이다.
변수 접두사의 예
접두사 | 작명 예 | 접두사가 의도한 용어 | 사용 예 |
m m_ |
mData _m_data |
member | 클래스에 속한 데이터 멤버 |
s ms ms_ |
sLookupTable msLookUpTable ms_lookupTable |
static | static 변수 또는 데이터 멤버 |
k | kMaximumLength | konstant(constant의 독일어 표현) | 상수값, 어떤 프로그래머는 상수명에 대문자만 사용한다. |
b is |
bCompleted isCOmpleted |
Boolean | 참/거짓의 이진 변숫값 |
n mNum |
nLines mNumLines |
number | 카운터로 사용되는 데이터 멤버 변수, n이 m과 모양이 비슷하기 떄문에 어떤 프로그래머는 좀 더 긴 mNum을 접두사로 사용한다. |
3.4.2.3 게터와 세터
클래스가 데이터 멤버 변수를 가지고 있다면, 예를 들어 mStatus 데이터 멤버 변수가 있다면, 별도의 메서드를 통해 그 변수에 접근할 수 있도록 getStatus()나 setStatus()같은 메서드를 제공하는 것이 좋다.
이렇게 데이터 멤버 변수를 읽고 쓸 수 있게 해주는 메서드를 게터/세터 메서드라고 한다.
이런 메서드는 관례로 많이 사용한다. C++언어에서 이러한 메서드를 따로 네이밍원칙으로 정한것 은 없다.
3.4.2.4 대소문자의 활용
대 소문자를 네이밍에 활용하는 방법에는 여러가지 가 있다.
중요한 점은 대소문자 사용에 대한 확실한 원칙을 개발팀 차원에서 가이드하고 프로그래머는 그 원칙을 따라야 한다는 것이다.
예를들어 어떤 프로그래머는 이름에 포함된 단어를 구분하기 위해 밑줄 문자(priority_queue)를 사용하고, 어떤 프로그래머는 대문자 (PriorityQueue)를 사용한다면, 코드가 매우 지저분해보일 것 이다.
변수와 클래스 데이터 멤버는 대부분 소문자로 시작하고, 단어 구분을 위해 밑줄 문자나 대문자를 사용한다.
3.4.2.5 네임스페이스와 상수
그래픽 유저 인터페이스를 가진 프로그램을 개발 중이라고 하자.
이 프로그램의 메뉴에는 파일, 편집, 도움말과 같은 항목이 있다.
각 메뉴의 항목을 나타내기 위해 고유한 상수 ID값을 부여하기로 했다.
이때 '도움말' 메뉴 ID를 위한 상수값의 이름은 kHelp가 가장 적당하다.
그런데 어느 날 메인 창에 도움말 버튼을 넣기로 한 순간부터 kHelp에 문제가 생긴다.
도움말 버튼을 위한 고유 ID값도 필요한데 가장 적합한 이름이 이미 사용중이기 때문이다.
이럴때 네임스페이스를 서로 다르게 가져가는 것이 좋다.
Menu와 Button 두개의 네임스페이스를 만들고 각 네임스페이스 안에 kHelp를 두어 Menu::kHelp, Button::kHelp와 같이 사용하는것 이다.
더 바람직한 방법은 열거 타입을 사용하면 된다.
3.4.2.6 헝가리언 표기법
헝가리언 표기법(Hungarian Notation) 은 변수나 데이터 멤버를 네이밍 할 때 사용하는 관례중 하나로, 마이크로소프트 윈도우 프로그래머 사이에서 많이 사용한다.
기본적인 아이디어는 접두사(prefix)를 만들 때 m처럼 단순하게 문자 하나만으로 하지 않고 좀 더 많은 의미를 담아 여러 문자로 하는것이다.
char* pszName; // psz는 null로 끝나는 문자열(psz: Pointer, String, Zero-terminated) 란 뜻이다.
이런 방식을 헝가리언 표기법 이라고 하는 이유는 이 방식을 만든 찰스 시모니(Charles Simonyi)가 헝가리 출신이기 때문이다.
적절하게 네이밍된 변수라면 접두사 외에 추가적인 정보를 담을 필요가 없다.
데이터 멤버 이름으로 mName이면 충분하지, m_pszName과 같이 복잡하게 해서 얻을 이익은 별로 없다.
'전문가를 위한 C++정리' 카테고리의 다른 글
3. 코딩 스타일 3.5 스타일이 있는 언어의 활용 3.5.2 참조형으로 포인터 대체 (0) | 2024.01.18 |
---|---|
3. 코딩 스타일 3.5 스타일이 있는 언어의 활용 3.5.1 상수의 이용 (0) | 2024.01.17 |
3. 코딩 스타일 3.4 네이밍 3.4.1 좋은 이름의 선택 (0) | 2024.01.17 |
3. 코딩 스타일 3.3 코드 분할 3.3.1 리팩토링을 통한 코드 분할 (0) | 2024.01.16 |
3. 코딩 스타일 3.2 코드의 문서화 3.2.2 주석 작성 스타일 (0) | 2024.01.16 |