[전문가를 위한 C++] 3장 : 코딩 스타일
2026. 2. 23. 23:52
3.2 코드 문서화
3.2.1 주석을 작성하는 이유
1 사용법을 알려주는 주석
- 때로는 함수 호출하기 전과 후에 특정 조건을 만족해야 하는데, 이러한 사항은 주석 외에는 표현할 방법이 없다
// 매개변수
// record: 주어진 레코드에 데이터베이스 ID가 없다면
// 데이터베이스로부터 할당된 ID를 저장하도록 레코드 객체를 수정한다
// 익셉션 발생
// openDatabase() 를 먼저 호출하지 않은 상태에서
// 이 메서드를 호출하면 익셉션 발생
int saveRecord(Record& record);
2 복잡한 코드를 설명하는 주석
- 코드 중간에 이해하기 힘든 부분마다 문장 속에 인라인 주석을 달았다.
3 메타 정보를 제공하는 주석
- 메타정보는 코드의 구체적인 동작에 대한 표현이 아니라 코드 생성에 대한 세부사항만 표현한다.
3.2.2 주석 스타일
1 문장 단위의 주석
if(isEven(result)) {
}
- 표현식을 이런 식으로하면 주석따로 달 필요없고 코드 재사용성도 높아진다
2 머리말 주석
- 소스파일의 첫머리를 항상 표준주석으로 시작하도록 정하는 방법도 있다.
- 저작권정보
- 파일과 클래스에 대한 간략한 설명
- 최종 수정 일자
- 최초 작성자
- 변경 내역
- 미완성 기능
- 발견된 버그
3 고정 양식 주석
- 자바 프로그래머는 주석을 프로젝트에 대한 문서를 하이퍼링크 기반으로 자동생성해주는 JavaDoc이란 도구에서 정한 표준양식에 따라 작성
4 임의 주석
5 코드가 곧 문서인 코드
술술 읽히면서 꼭 필요한 정보만 주석으로 단 코드가 좋은 코드다
3.3 코드 분해
- 코드 분해(decomposition)란 코드를 더 작은 단위로 나눠서 작성하는 방식
3.3.1 리팩터링을 통한 코드 분해
- 추상화 수준을 높이는 기법
- 필드 캡슐화 : 필드를 private으로 설정하고 게터나 세터 메서드로 접근하게 만든다
- 타입 일반화 : 코드를 공유하기 좋게 더 일반적인 타입을 사용한다.
- 코드를 좀 더 논리적으로 분해하는 기법
- 메서드 추출 : 거대한 메서드를 좀 더 이해하기 쉽도록 일부를 뽑아내서 새로운 메서드를 정의한다.
- 클래스 추출 : 기존 클래스에 있는 코드 중 일부를 새 클래스로 옮긴다.
- 명칭과 위치를 개선하는 방법
- 메서드 및 필드 옮기기 : 좀 더 적합한 클래스나 소스 파일로 이동
- 메서드 및 필드 이름 바꾸기 : 목적이 잘 드러나도록 이름을 바꾼다
- 올리기 : OOP에서 기본 클래스로 옮기는 기법
- 내리기 : OOP에서 상속 클래스로 옮기는 기법
3.4 명명 규칙
- c++ 컴파일러는 다음과 같은 명명 규칙을 따른다
- 이름의 첫글자로 숫자가 나올 수 없다
- 9to5
- 더블 언더스코어는 특정한 용도로 사용되기 때문에 이름에 넣을 수 없다
- my__name
- 언더스코어가 나온 다음 대문자로 시작하는 것도 특수한 용도로 정해져있기 때문에 사용하면 안된다
- _Name
- 글로벌 네임스페이스에서 언더스코어로 시작하는 이름은 용도가 따로 있기 때문에 사용할 수 없다
- _name
- 이름의 첫글자로 숫자가 나올 수 없다
3.4.1 좋은 이름과 나쁜 이름
| 좋은 이름 | 나쁜 이름 |
|---|---|
| sourcedName, destinationName 두 객체를 명확히 구분할 수 있다. |
thing1, thing2 너무 광범위하다 |
| g_settings 글로벌(전역) 상태란 뉘앙스 |
globalUserSpecificSettings 너무 길다 |
| m_nameCounter 데이터멤버의 상태란 뉘앙스 |
m_NC 너무 짧고 암호같다 |
| calculateMarigooldOffset() 간결하고 명확 |
doAction() 너무 광범위하고 불분명 |
| m_typeString | |
| errorMessage | |
| sourceFile, destinationFile | srcFile, dstFile 준말 |
3.4.2 명명 규칙
1 카운터
2 접두어
3 헝가리안 표기법
4 게터와 세터
- getStatus(), setStatus()
5 대소문자 활용
6 네임스페이스를 적용한 상수
3.5 언어의 기능에 스타일 적용하기
a[i] = ++i;
// 피해라!!
3.5.1 상수 사용법
const double ApproximationForE {2.71828};
3.5.2 포인터 대신 레퍼런스 사용하기
- c++ 대신 레퍼런스를 사용하면 장점
- 포인터보다 레퍼런스가 더 안전하다. 메모리 주소를 직접 다루지 않고, Nullptr이 될 수 없기 때문이다.
- 코딩 스타일 측면에서 포인터보다 레퍼런스를 사용하는 것이 낫다.
- 메모리의 소유권을 명확히 표현할 수 있다.
- 레퍼런스로 전달하면 전달된 객체에 할당된 메모리를 해제하기는 쉽지 않다. 하지만 포인터로 전달하면 그렇지 않다.
3.5.3 사용자 정의 익셉션
3.6 코드 서식
3.6.1 중괄호 정렬 문제
3.6.2 스페이스와 소괄호에 대한 논쟁
3.6.3 스페이스, 탭, 줄바꿈
3.7 스타일과 관련하여 해결할 문제
- 스타일에 대한 일관성을 이 정도 수준으로 유지하기 쉽지않다.
- 먼저 const 사용법을 제대로 이해하지 못한 프로그래머가 종종있다.
- const를 제대로 활용하지 못한 라이브러리 함수나 예전 코드를 마주치게 된다. 예를 들어 const 매개변수를 받는 함수를 작성하는 과정에서 비 const 매개변수를 받는 레거시코드를 호출
- 실력있는 프로그래머라면 const 속성을 잠시 적용하지 않을 부분을 const_cast 처리
- 경험없으면 const를 전혀 사용하지 않는 프로그램처럼 만들어버린다
- 먼저 const 사용법을 제대로 이해하지 못한 프로그래머가 종종있다.
'C++' 카테고리의 다른 글
| [전문가를 위한 C++] 6장 : 재사용을 고려한 설계 (0) | 2026.02.23 |
|---|---|
| [전문가를 위한 C++] 5장 : 객체지향 설계 (0) | 2026.02.23 |
| [전문가를 위한 C++] 4장 : 전문가답게 C++ 프로그램 설계하기 (0) | 2026.02.23 |
| [전문가를 위한 C++] 2장 : 스트링과 스트링 뷰 다루기 (0) | 2026.02.23 |
| [전문가를 위한 C++] 1장 : C++와 표준 라이브러리 초단기 속성 코스 (1) | 2026.02.23 |



