C++

나만의 C++ 프로그래밍 가이드

카루-R 2022. 10. 1. 14:14
반응형

환영합니다, Rolling Ress의 카루입니다.

이건 제가 중학교 때 Overcalc를 개발하면서 작성했던 C++ 프로그래밍 가이드라인입니다. 일부는 꼭 지켜야 하는 것도 있지만, 가끔가다 '이건 뭐지' 싶은 것들도 있을 거예요. 지금 시점에서도 제가 일반적인 프로그래밍에서 지켜야 하는 것들은 진하게 표시를 해둘 테니 참고하시면 되겠습니다.


1) 변수의 이름

변수를 선언할 땐 반드시 매크로 var 키워드를 붙인다. 또한 자료형에 따라 변수의 앞 글자를 다르게 한다.

#define var
var int nSubjects = 10;
var string strName = "카루";

2) 포인터 동적할당

new 연산자를 단독으로 사용하지 않고, shared_ptr<T> ptr = make_shared(new ...)를 이용한다.

3) NULL

C++에서의 NULL은 void* 형이 아닌 int형 0이다. 포인터를 매개변수로 넣거나 초기화를 할 때는 nullptr를 쓰도록 하자.

4) 전역 변수와 함수

이것들은 객체지향 프로그래밍을 방해한다. 가장 관련이 깊은 헤더 파일의 Overcalc 네임스페이스에 넣는다.

5) using namepsace std

C++은 굉장한 모호성을 일으킬 수 있으므로 네임스페이스를 using 선언으로 생략하는 일은 피한다.

6) using - typedef

이제는 typedef를 쓰지 말자. 템플릿을 지원하는 using을 사용하자.

7) using Overcalc::Console

Console 객체는 유일하게 'Overcalc::'를 생략할 수 있다.

8) 주석

한 줄 주석(//)은 메인 개발자만 사용할 수 있다. 일반 개발자는 /**/ 주석을 쓰면 메인 개발자가 한 줄 주석으로 대체한다.

9) 블록

블록이 끝날 때 닫는 중괄호 옆에 블록의 맨 윗줄을 주석으로 복사한다.

class Subject : public Base { ... } // class Subject : public Base

10) 범위 기반 for 문

vector, deque, 배열 등의 인덱스에 차례로 접근할 때는 범위 기반 for 문을 쓰도록 한다.

11) for each 문

for each는 표준이 아니며 (Visual C++ 확장) 이 구문 안에선 없던 예약어 in까지 생긴다. 가독성이 좋긴 하지만 for each 대신 범위 기반 for 문을 사용하자.

12) dynamic_cast, typeid

dynamic 이란 이름답게 이 연산자들은 RTTI(Run Time Type Information) 기반으로 동작한다. 프로그램의 성능을 떨어뜨리는 주범이니 사용을 자제하자.

13) 강제 형 변환

C 스타일 형 변환 연산자는 절대 사용하지 않는다. void*를 사용하거나 static_pointer_cast 등을 사용하고 어쩔 수 없을 때만 reinterpret_cast<>()를 사용한다.

14) 매크로 상수 정의는 금물!

TRUE와 FALSE를 사용하지 않는다. constexpr int와 enum class를 대신 사용한다.

15) 매크로 함수는 inline으로

매크로는 치환이다. 치환 과정에서 어떤 문제가 생길지 예측할 수 없으며, 매크로 함수는 더욱이 매개변수에 자료형을 지정할 수 없다. 대신, inline 함수를 사용하자. 유니코드와 멀티 바이트 양방향 지원을 위한 _t~ 매크로는 허용한다.

16) 사용자의 스캔 코드 값을 알려면 KEY 열거형을 이용하자.

단순한 상수보다 가독성이 좋다. 관계, 대입 연산자를 미리 구현해 두었다.

17) 설정만으로 유니코드 버전과 멀티 바이트 버전을 만들어라.

_TCHAR, Int 등은 <tchar.h>에서 혹은 메인 개발자가 프로젝트 설정에 따라 유니코드, 멀티 바이트 혹은 32비트, 64비트로 빌드 할 수 있게 한 자료형이다. 역시 적극 활용하기를 권한다.

18) 경고는 경고다.

경고는 코드에 문제가 있다는 것이다. 경구 수준을 최상위로 올리고 모두 해결하도록 하자.

19) 하나의 함수에는 하나의 기능만!

함수가 매우 짧은 경우에는 inline을 이용한다.

20) 후위 연산자보다는 전위 연산자를 사용한다.

불필요한 임시 객체를 생성하지 않는다.

21) 감추어라 (캡슐화)

클래스의 필드 중 외부에 노출될 필요가 없는 것은 다 private을 지정한다.

22) const를 적극 활용하라.

클래스의 메서드는 최대한 상수형으로 선언/정의한다. 클래스를 매개변수로 사용할 때는 상수형 참조를 이용한다.

23) 예외 처리를 확실히 한다.

try~throw~catch를 이용해 오류를 사전에 방지한다.

24) vector와 string을 적절히 사용하자.

배열보다 낫다.

25) 중복 템플릿의 괄호는 띄어 쓰자.

닫는 템플릿의 경우 >> 연산자와 헷갈리는 경우가 있다.

(* C++11이후부터 언어적으로 이러한 문제가 해결되었습니다.)

26) 템플릿 클래스 및 템플릿 함수는 hpp로 구현한다.

링커 오류를 방지하기 위해 hpp에 통합하여 정의하며, define 방어를 적용한다.

27) 같은 값을 여러 자료형으로 접근할 때는 템플릿 변수

C++14에서 변수 템플릿이 생겼다. 원주율 등에서 유용하다.

28) auto 키워드

C++11에서 추가된, 자료형을 추론하는 auto 키워드는 템플릿에서 특히 유용하지만 이것을 사용할 땐 원 자료형이 무엇인지 알고 있어야 한다.

29) decltype(x)

템플릿 인수에도 사용할 수 있는 decltype 키워드를 적극 활용하자.

30) 함수의 선언

__declspec(nothrow), noexcept 등을 적절히 사용하고, 선언은 한 줄에서 끝내자.

31) 전역 네임스페이스를 이용하는 엔티티엔 ::을 반드시 붙이자.

32) 권장하지 않는 함수

[[deprecated]]로 선언된 함수는 보안, 기능 폐지 혹은 기타 이유로 메인 개발자가 막은 것이다. 사용하지 말자.

반응형