C++에 있어서 알아야하는 필수 기법들
1. 코딩스타일(Coding Style)
- 중괄호 작성 스타일
- GNU 스타일: 블록을 통째로 안으로 들여쓰는 스타일로 구조가 제일 잘보이지만 들여쓰기 정도가 심해서 수평으로 많은 코드를 작성하기 힘들다.
- K&R 스타일: C언어나 C++ 창시자들이 문서 작성 시 주로 사용하는 스타일로, 괄호가 블록 시작행의 끝에 있다는 점이 특징적이다. 코드 라인을 절감할 수 있다는 장점이 있다.
- BSD 스타일: 여는 괄호가 별도의 소스 라인을 차지하므로 코드가 길어지는 단점이 있지만, 블록의 구조가 명시적으로 잘 보이며 가독성이 좋은 장점이 있다.
- 들여쓰기
- 블록 앞쪽에 탭이나 공백을 넣어 상위 블록보다 안쪽에 배치하여 종속관계를 표현한다.
- 들여쓰기는 탭이나 공백을 사용한다.
- 일반적으로 (스페이스 키 기준)4칸정도가 가장 무난
- 빈 줄 사용 여부
- 빈 줄의 사용에 따라서 가독성의 차이가 생김
- 코드의 가독성을 위해 지역 변수 선언문과 본체 코드 사이를 빈 줄로 구분하는 것을 추천
- 명칭 작성법
- 변수나 함수의 이름 작성 시, 대상과 연관된 이름으로 작성
- 길이가 긴 이름의 경우, 단어와 단어 사이에 _(언더바)를 넣어서 이어줄 것
- 사용 용도에 따라 파스칼/카멜을 구분하여 사용해 줄 것
- 파스칼 케이스:
ㄴ 어근만 대문자인 경우는 주로 함수의 이름을 정하는 경우에 사용
ㄴ 첫번째 글자만 대문자로 하고, 두 단어 이상의 합성어일 경우 각 단어의 첫 글자를 대문자로 작성
ㄴ (JS에서는 주로) 클래스, 인터페이스나 타입의 이름에 사용
- 카멜 케이스:
ㄴ 변수명이 낙타의 모양과 닮았다고 하여 지어졌다.
ㄴ 소문자 알파벳으로 이루어지되, 두 단어 이상의 합성어일 경우 두번째 단어부터는 첫글자를 대문자로 작성
ㄴ 주로 변수명, 메소드명, 속성 등에 사용
- 변수의 이름앞에 접두어 b, p, i 등을 붙여 타입 구분 가능
2. 조건부 컴파일
조건부 컴파일 지시자
- 지정한 조건의 진위 여부에 따라 코드의 일정 부분을 컴파일 할 것인지에 대한 여부를 결정
- 전처리문이므로 컴파일 전에 조건을 평가
- 한 벌의 코드를 조건에 따라 다르게 컴파일하여 상이한 실행 파일을 만들 수 있음
#ifdef 매크로명
코드
#endif
#ifdef 다음에 조건이 되는 매크로명을 써주고 endif 사이에 조건부로 컴파일 코드를 작성
조건부 컴파일 사용 예
#ifdef PROFESSIONAL
고급 기능
#endif
- 2,3가지 이상의 비슷한 시스템 모델이 있을 경우, 하나의 프로그램의 모드/프로그램 사용 수준에 따라서 어떤 코드를 활성화 시켜 사용할지를
3. 다차원 포인터
포인터란 무엇인가
포인터와 참조자
- 참조자
: 널 참조자(Null reference)는 존재하지 않는다. 참조자는 어떠한 경우에서든지 메모리를 차지하고 있어야 한다.
- 포인터
: 널 포인터(Null pointer)는 존재한다.
만약 객체를 참조하는 변수를 두고 싶은데, 그 객체가 널(null)일 가능성이 있다면 참조자를 사용하지 말고 포인터를 사용해야 한다.
char *pc = 0;
char &rc = *pc;
4. 메모리 누수(Memory Leak)
메모리 누수란?
C/C++에서는 메모리 핸들링이 자유로워 메모리 할당 권한이 개발자에게 있다. 따라서 메모리를 할당하고 실수로 메모리를 해제하지 않았을 경우 메모리 누수가 발생한다.
특히, 24시간 동작하는 서버의 경우 메모리 릭이 누적되면 시스템이 다운되는 치명적인 문제가 발생할 수 있다.
MFC의 메모리 추적 코드
MFC 프로젝트의 경우는 다음과 같은 소스가 제공됨으로써 메모리 릭 추적이 가능하다
#ifndef DEBUG
#define new DEBUG_NEW
#endif
콘솔 응용 프로그램의 메모리 추적 코드
콘솔 응용 프로그램의 경우는 다음과 같은 소스 코드로 추적이 가능한데, 필요한 헤더 파일을 추가한 다음 매크로 플래그를 설정하는 순이다.
#include<crtdbg.h>
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);