본문 바로가기

분류 전체보기105

[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.
[C++ Core Guidelines] P.9 시간과 공간을 낭비하지 말자 P.9: Don’t waste time or space 이유 C++ 프로그래머시잖아요... 알아두기 목표 (예: 개발 속도, 리소스 안전성, 테스트 단순화 등) 를 달성하기 위해서 시간과 공간을 낭비하면 안됩니다. "효율성을 추구하는 것의 또 다른 장점은 그 과정을 통해 문제를 더 깊이 이해할 수 있다는 것입니다." - Alex Stepanov 예시 (나쁜 예) struct X { char ch; int i; string s; char ch2; X& operator=(const X& a); X(const X&); }; X waste(const char* p) { if (!p) throw Nullptr_error{}; int n = strlen(p); auto buf = new char[n]; if (!b.. 2024. 4. 19.
[C++ Core Guidelines] P.8 자원이 새지 않도록 하자 P.8: Don’t leak any resources 이유 자원 사용량이 천천히 증가하더라도 시간이 지나면 언젠가는 시스템의 모든 자원은 고갈됩니다. 메모리 뿐만 아니라 파일 핸들과 소켓 등도 OS 가 마음대로 제공하는게 불가능한 한정된 자원입니다. 자원이 새지 않도록 하는 것은 오랜 기간 실행되는 프로그램에서 상당히 중요할 뿐만 아니라 프로그래머의 책임감을 보여주는 요소이기도 합니다. 예시 (나쁜 예) void f(char* name) { FILE* input = fopen(name, "r"); // ... if (something) return; // 나쁨 : something == true 일 때, 파일 핸들이 누수됩니다 // ... fclose(input); } 위처럼 코드를 작성한다면 fclos.. 2024. 4. 17.
[C++ 23] std::print, std::println 사용하기 [C++98] std::cout 문법은 [C언어] printf() 에 비해 개체지향적 특성을 반영하여 다형성을 지원하고 (타입에 유연) 연산자 오버로딩을 활용하여 기능을 변경할 수 있는 유연성을 가졌지만, 성능이 느리고, 여러개의 요소를 연쇄적으로 출력할때 코드가 상당히 길어지며, 출력 형식을 바꾸기 위해서 io manipulator 사용시 코드가 상당히 지저분해지는 단점이 있었습니다. 이를 해결하기 위해 나온 것이 [C++ 23] std::print, std::println 입니다. 현대적 언어 (예: 파이썬) 와 문법이 비슷해졌음을 알 수 있습니다.사용을 위해선 #include 헤더를 추가해야 합니다. 사용 예시 (std::print 와 std::println 차이점)#include int mai.. 2024. 4. 15.