프로그래밍231 C++] std::chrono 라이브러리 C++ std::chrono 라이브러리 C++의 chrono 라이브러리는 시간과 관련된 작업을 처리하기 위한 도구다. 이 글에서는 C++ chrono 라이브러리의 세 가지 주요 클럭 구조체와 클럭 구조체와 함께 사용되는 duration, time_point 클래스에 대해 정리해보고자 한다. 🔍 클럭 구조체 클럭 구조체는 다음의 3가지가 존재한다. std::chrono::system_clock현재 시스템 시간을 나타내는 클럭이다.시스템 시간이 변경되거나 NTP(Network Time Protocol) 동기화 등으로 수정되면 system_clock의 값도 영향을 받는다.Windows에서는 GetSystemTimePreciseAsFileTime 함수를 래핑한 구조체로 구현된다.해상도는 밀리초 수준이다.주로.. 2025. 5. 12. C++] explicit 키워드 explicit 키워드 C++에서 매개변수를 하나만 받는 생성자는 암시적으로 변환되어 객체를 생성할 수 있는데 이는 원하지 않은 변환을 초래할 가능성이 있다. 이를 방지하고 코드의 안정성을 높이기 위해 생성자 앞에 explicit 키워드를 사용한다. explicit 키워드 없이 암시적 형 변환이 발생하는 경우#include class MyClass {public: MyClass(int value) : data(value) {} // explicit 키워드 없음 int getData() const { return data; }private: int data;};void printMyClass(MyClass myClass){ std::cout 🔍 위 코드에서 explici.. 2025. 5. 6. C++ ] uint8_t, int_8t를 스트림 연산자(<<)로 출력할 때의 문제점 C++에서 char, singed char, unsigned char 타입은 스트림 연산자( uint8_t와 int8_t도 내부적으로 각각 unsigned char, singed char로 정의되어 있기 때문에 마찬가지이다. 즉, C++에서 8비트 데이터 타입 중 std::ostream #include #include int main() { char c = 65; signed char sc = 66; unsigned char uc = 67; uint8_t u8 = 68; int8_t i8 = 69; std::cout 때문에 해당 타입을 정수로 출력하기 위해서는 명시적으로 다른 정수 데이터 타입으로 캐스팅을 하거나, std::cout (u.. 2025. 4. 18. C++] 파일 입출력시 최적화 방안 C++ 기준 파일 입출력 시 최적화를 통해 속도 개선하는 방법들을 몇가지 소개한다. 1. 큰 버퍼를 미리 할당해서 메모리 재할당 방지 std::vector, std::string 등은 내부적으로 동적 메모리를 사용하는데, push_back()이나 append()로 데이터를 계속 집어넣다 보면 사이즈가 커질 때마다 메모리 재할당이 발생해서 성능이 저하될 수 있다.이를 방지하기 위해 reserve()로 초기에 충분한 용량을 미리 확보해 두면 이후 데이터 추가 시 메모리 재할당 없이 빠르게 처리할 수 있다.reserve()는 capacity만 늘릴 뿐 size()나 length()에는 영향을 주지 않으며, 선언 시 큰 사이즈로 만든 다음 clear()를 하더라도 capacity는 그대로 유지된다. std:.. 2025. 4. 17. strtoul, strtol, strtof 구현 기존 C표준 라이브러리 함수와 차이가 있다면, 원래 strtoul, strtol 함수는 명시적으로 base 인자를 받는데 이를 받지 않고 자동으로 base를 감지하도록 하였다. 이는 원래 함수에서 base 인자가 0인 경우와 같은 동작을 한다.또한 원래 strtoul, strtol 함수는 2진수 접두사 "0b"를 처리하지 않는데 이를 처리하도록 하였다.그리고 원래 strtof 함수 과학적 지수 표기(e 또는 E)를 지원하나 간단한 구현 및 처리를 위해 이를 지원하지 않는 버전으로 했다. #include // 공백 문자 확인int my_isspace(char c) { return (c == ' ' || c == '\t' || c == '\n' || c == '\r' || c == '\v' || c == '.. 2025. 2. 22. C ] X-Macro X-Macro란? 매크로 X()를 재정의하여 데이터를 다양한 형태로 확장하는 기법으로, 주로 리스트 데이터를 정의하고 이를 바탕으로 열거형 및 이에 맵핑되는 문자열 배열을 생성하는데 사용된다. 사용 예시 #include // 리스트 정의#define ERROR_LIST \ X(ERROR_NONE) \ X(ERROR_INVALID) \ X(ERROR_TIMEOUT) \ X(ERROR_OVERFLOW)// enum 정의enum {#define X(name) name, ERROR_LIST#undef X ERROR_COUNT};// 문자열 배열 생성const char *ErrorNames[] = {#define X(name) #name, ERR.. 2025. 1. 30. C] 콘솔 프로그램 플리커 현상 개선하기 (더블 버퍼링 & 오프스크린 버퍼) 콘솔 화면을 주기적으로 갱신하는 프로그램을 개발 시 화면이 깜빡이는 플리커(flicker) 현상이 발생할 수 있다. 이번 글에서는 이런 플리커 현상을 개선하기 위한 전략을 알아보자. 먼저 대략 60fps로 7세그먼트 형식의 디지털시계를 출력하는 C언어 프로그램을 작성해보았다. 프로그램을 실행시키면 아래 이미지 처럼 화면이 깜빡이면서 출력되는 것을 볼 수 있다. 1. 플리커 현상의 원인은? 플리커 현상은 화면 갱신 과정에서 발생하는 중간 상태가 사용자에게 노출되면서 발생한다. 아래 코드를 보면 system("cls")를 사용해 화면을 완전히 지운 후, 초기화된 화면에 새로운 데이터를 출력하고 있다. 이 과정이 빠르게 반복되면서 빈 화면과 새 데이터를 그리는 중간 상태가 짧은 시간 동안 화면에 보여지.. 2025. 1. 5. inet_addr, inet_aton, inet_pton, inet_ntoa, inet_ntop 1. 문자열 형식의 IP 주소를 uint32_t 형식으로 변환하는 함수 :inet_addr, inet_aton, inet_pton - inet_addr문자열 형식의 IPv4 주소를 uint32_t로 변환.반환된 값이 네트워크 바이트 순서로 저장됨.Deprecated(더 이상 권장되지 않으며, 향후 버전에서 제거될 가능성이 있으니 사용을 자제해야하는 함수) 이므로 최신 코드에서는 inet_aton 또는 inet_pton을 사용하는 것이 권장됨.#include #include #if defined(_WIN32) || defined(_WIN64)#pragma comment(lib,"ws2_32")#include #else#include #endifint main() { const char* ip_str = .. 2024. 12. 17. C++ ] <random> 헤더 사용 난수 생성 C++ 헤더를 사용해 난수 생성하는 방법 1. 헤더 파일 포함#include 2. 시스템 기반 난수 시드 생성시스템에서 제공하는 하드웨어 기반 난수 시드를 가져온다.std::random_device rd; 3. 난수 생성 엔진 초기화시드를 사용해 난수 생성 엔진을 초기화한다. 보통은 Mersenne Twister 알고리즘을 사용한 std::mt19937 엔진을 많이 사용한다.std::mt19937 gen(rd()); // Mersenne Twister 엔진에 시드 할당 4. 분포 정의 (범위와 형식 설정)난수가 발생할 범위와 형식은 분포(distribution)를 통해 정의한다. 정수형 균등 분포, 범위 내의 모든 값이 동일한 확률로 선택된다.std::uniform_int_distribu.. 2024. 12. 3. C++ ] CLI Loading indicator와 Progress bar 사용자에게 작업이 진행중임을 알리는 간단한 로딩 인디케이터와 프로그레스 바 만들어보기 로딩 인디케이터 #include #include using namespace std;bool running = true;void loading_indicator() { const char* states[] = {" ", ". ", ".. ", "... ", ".... ", "....."}; int index = 0; while (running) { cout 프로그레스 바 #include #include #include using namespace std;class ProgressBar {private: int barWidth; int progress;.. 2024. 10. 28. 이전 1 2 3 4 ··· 24 다음