본문 바로가기

전체 글42

[C++ Core Guidelines] I.2 전역 변수는 상수로 만들자 I.2: Avoid non-const global variables 이유일반 전역 변수의 사용은 숨겨진 의존성을 만들고 실행 흐름을 예측하기 여럽게 합니다.  예시 (나쁜 예)struct Data { // ... 엄청 긴 코드 ...} data; // non-const datavoid compute() // 나쁨{ // ... data 사용함 ...}void output() // 나쁨{ // ... data 사용함 ...}위처럼 엄청 긴 코드에서 일반 전역 변수 data 는 여러 함수에 걸쳐 사용되고 있다고 한다면, 누가 최종적으로 data 를 사용했는지 알기가 쉽지 않습니다.함수만 따로 분리해서 테스트하는 유닛 테스팅을 어렵게 만들고, compute().. 2024. 4. 30.
[C++ Core Guidelines] I.1 인터페이스를 분명하게 만들자 I.1: Make interfaces explicit 이유인터페이스 규약을 제대로 보여주지 않으면 다른 프로그래머들이 놓치기 십상입니다.  예시 (나쁜 예)int round(double d){ return (round_up) ? ceil(d) : d; // 나쁨 : 감춰진 의존성}round_up 이라는 전역 플래그 변수를 통해 함수의 동작이 결정되고 있습니다.대부분의 사람들은 round() 함수가 어떻게 만들어졌는지 자세히 뜯어보고 싶지 않을 것입니다.round(7.2) 가 어떤 날은 8 이 나오고 어떤 날은 7 이 나오게 하는 것보단 명백하게 반올림만 하는 것이 훨씬 깔끔합니다.  알아두기물론 디버그 옵션, 멀티 플랫폼 빌드와 같이 C++ 세계에선 매크로를 통해 외부에서 실행 흐름을 통제하는.. 2024. 4. 30.
[C++ Core Guidelines] P.12, P.13 도구를 잘 활용하자 P.12: Use supporting tools as appropriateP.13: Use support libraries as appropriate 이유컴퓨터가 여러분 대신 해줄 수 있는 일이 많이 있습니다. 사람은 지루한 작업을 반복적으로 수행하는 것보다 더 나은 일을 해야 합니다.라이브러리를 만드는데 사용되는 비용(시간, 노력, 돈 등) 은 여러 사용자가 공유할 수 있습니다. 널리 사용되는 라이브러리는 개별 애플리케이션보다 최신 상태로 유지되고 새로운 시스템으로 이식될 가능성이 더 높고 문서화도 잘 되어있습니다.널리 사용되는 라이브러리에 대한 지식은 다른/향후 프로젝트에서 시간을 절약할 수 있기 때문에 적절한 라이브러리가 있으면 이를 사용하는 것이 좋습니다.  알아두기아래와 같은 시중의 코드 분석기.. 2024. 4. 26.
[C++ Core Guidelines] P.11 지저분하게 코딩하지 말고 캡슐화하자 P.11: Encapsulate messy constructs, rather than spreading through the code 이유지저분한 코드는 버그를 숨길 가능성이 높고 유지보수가 어렵습니다. 인터페이스를 만들면 사용하기 쉽고 안전합니다.  예시 (나쁜 예)int sz = 100;int* p = (int*) malloc(sizeof(int) * sz);int count = 0;// ...for (;;) { // ... x 값을 계속 입력받고, 파일 끝(EOF)에 도달하면 루프를 종료하는 코드 ... // ... x 값이 정상적인지 검증하는 코드 ... if (count == sz) p = (int*) realloc(p, sizeof(int) * sz * 2); .. 2024. 4. 26.
[C++ 20] std::source_location 사용하기 [C++ 20] std::source_location 를 사용하면 현재 코드 실행 정보를 개체로 만들어 다양하게 활용할 수 있습니다. 사용을 위해선 #include 헤더를 추가해야 합니다. 기존 [C 언어] 의 __LINE__, __FILE__, __DATE__, __FUNCTION__ (C99 : __func__) 와 같이 미리 정의된 표준 매크로 의 문제점을 개선하기 위해 만들어졌습니다. 예를 들어, __FUNCTION__ 을 사용하면 함수 이름만 얻을 수 있고 함수의 반환 타입과 입력 파라미터 정보를 얻을 수 없는 문제가 있었는데 std::source_location 를 사용하면 모든 정보를 얻을 수 있습니다. (__FUNCSIG__ 같은 매크로를 사용할 수 있지만 표준이 아닙니다) 사용 예시 #i.. 2024. 4. 22.
[C++ Core Guidelines] P.10 가급적 const를 사용하자 P.10: Prefer immutable data to mutable data 이유 상수를 사용하면 실수로 데이터를 오염시킬 수 없으며, 값을 바꾸지 않겠다는 프로그래머의 의도를 코드로 보여줄 수 있습니다. constexpr, const 등을 사용하면 데이터가 불변임을 보장하므로 컴파일러가 최적화 하기도 쉽고 병렬 처리시 자원 경쟁 (data race) 을 걱정할 필요가 없습니다. 2024. 4. 21.