C++ STL에는 네 가지 종류의 집합(set) 컨테이너가 존재합니다. 바로 set, multiset, unordered_set, unordered_multiset입니다. 이들은 정렬 여부와 중복 허용 여부에 따라 서로 다른 특성을 가지며, 상황에 맞는 컨테이너를 선택하는 것이 성능과 코드 품질에 큰 영향을 미칩니다.이 글에서는 각 컨테이너의 핵심 속성을 살펴보고, 동일한 데이터를 삽입했을 때 어떤 차이가 발생하는지 예제와 함께 확인해 보겠습니다.1. set — 정렬된 고유 값 저장set은 가장 기본적인 연관 컨테이너로, 다음과 같
C++에서 변수가 해당 데이터 타입이 표현할 수 있는 유효 범위를 초과하면 개발자가 의도하지 않은 결과가 발생합니다. 가장 흔한 문제는 값이 최솟값으로 되감기면서(wrap-around) 반복문이 종료 조건을 만족하지 못해 무한 루프에 빠지는 것입니다. 이 글에서는 char, bool, unsigned short 타입을 예시로 범위 초과 시 어떤 일이 일어나는지 살펴보겠습니다. 1. char 타입의 범위 초과 char 타입은 1바이트 크기로 일반적으로 -128부터 127까지의 값을 저장할 수 있습니다. 아래 코드는 0부터 300까지
C++의 3법칙(Rule of Three)이란?3법칙(Rule of Three)은 C++ 프로그래밍에서 널리 통용되는 경험 법칙입니다. 좋은 코딩 습관을 위한 지침으로, 클래스에 다음 세 가지 중 하나라도 명시적으로 정의해야 한다면 나머지 두 가지도 함께 정의하는 것이 바람직하다는 내용입니다.복사 생성자(copy constructor)대입 연산자(assignment operator)소멸자(destructor)왜 세 가지가 모두 필요할까?그 이유는 간단합니다. 클래스가 위의 기능 중 하나라도 필요하다는 것은 해당 클래스가 동적으로 할
C++에서 생성자(Constructor)가 언제 호출되는지는 객체의 선언 방식에 따라 달라집니다. 객체는 크게 전역(global), 지역(local), 정적 지역(static local), 동적(dynamic) 네 가지 유형으로 나눌 수 있으며, 각 유형마다 생성자가 호출되는 시점이 다릅니다.1. 전역 객체(Global Object): main() 함수 실행 전 호출전역 객체의 생성자는 프로그램이 main() 함수에 진입하기 이전에 호출됩니다. 즉, main 함수의 첫 번째 문장이 실행되기도 전에 객체가 이미 초기화되어 있는 것입니
C++에서 int와 long 자료형의 크기는 고정되어 있지 않으며, 시스템 아키텍처와 운영체제에 따라 달라집니다. 이 글에서는 각 환경별 데이터 모델 표준과 실제 자료형 크기를 살펴보겠습니다. 32비트 시스템: ILP32 표준 32비트 시스템에서는 일반적으로 ILP32 표준을 따릅니다. 이 표준에서는 int, long, 그리고 포인터 변수가 모두 32비트입니다. 64비트 시스템: LP64와 LLP64 64비트 시스템은 운영체제에 따라 두 가지 데이터 모델로 나뉩니다. 리눅스(Linux) — LP64: long과 포인터는 64비
C++에서 POSIX 명령 실행하기 이번 글에서는 C++ 프로그램 안에서 POSIX 셸 명령을 실행하고 그 출력을 확인하는 방법을 알아보겠습니다. 방법은 매우 간단합니다. 표준 라이브러리에서 제공하는 system() 함수를 사용하면 됩니다. 이 함수에 실행하려는 명령어가 담긴 문자열을 인자로 전달하기만 하면 됩니다. 기본 문법은 다음과 같습니다. system(command) system() 함수는 전달받은 문자열을 운영체제의 셸(예: bash)에 그대로 넘겨 실행합니다. 따라서 터미널에서 직접 입력할 수 있는 대부분의 명령어를 C+
리눅스 환경에서는 GCC를 사용하여 C/C++ 프로그램을 컴파일할 수 있으며, GCC는 내부적으로 glibc 라이브러리를 활용합니다. glibc가 제공하는 backtrace() 함수를 사용하면 프로그램에 오류가 발생한 시점의 호출 스택(call stack)을 추적할 수 있습니다. 이 함수는 execinfo.h 헤더 파일에 정의되어 있습니다. 아래 예제에서는 세그먼테이션 폴트(Segmentation Fault)가 발생했을 때 스택 추적 정보를 자동으로 출력하는 방법을 살펴보겠습니다. 예제 코드 #include <iostream&
C나 C++에서는 float 타입의 난수를 직접 생성할 수 없습니다. 대신 약간의 트릭을 사용해야 하는데, 가장 일반적인 방법은 두 개의 난수 정수값을 만든 후 이를 나누어 부동 소수점 값을 얻는 것입니다.이때 나눗셈 결과가 정수(몫)가 되는 경우가 간혹 발생할 수 있습니다. 이러한 가능성을 줄이기 위해 결과에 0.5 같은 부동 소수점 상수를 곱해 주기도 합니다.기본 구현 예제아래 예제는 rand() 함수가 반환하는 최대값인 RAND_MAX로 나누어 0.0 ~ 1.0 사이의 실수를 만들고, 여기에 원하는 범위의 최대값(5.0)을 곱
C++ 프로그래밍에서 static_cast<>와 일반적인 C 스타일 캐스팅은 겉보기에는 같은 기능을 수행하는 것처럼 보이지만, 실제로는 중요한 차이점이 있습니다. 이 글에서는 두 캐스팅 방식의 차이를 자세히 살펴보겠습니다.기본 개념 비교(int)x와 같은 형태의 캐스팅은 전통적인 C 스타일 타입 변환입니다. 반면, C++에서는 static_cast<int>(x) 형태의 캐스팅 연산자를 사용합니다.두 방식의 가장 큰 차이점은 다음과 같습니다.컴파일 타임 검사: static_cast<>는 컴파일 시점에
이 글에서는 C++ 프로그램에서 사용자가 지정한 x 밀리초 동안 프로그램의 실행을 일시 중지(슬립)시키는 방법을 알아보겠습니다.clock() 함수를 활용한 슬립 구현 원리슬립 기능을 구현하는 방법은 다양한 라이브러리를 활용하는 것이 있지만, 여기서는 표준 라이브러리의 clock() 함수를 사용하겠습니다. clock() 함수는 프로그램 시작 이후 경과된 현재 CPU 시간을 반환합니다.구현 아이디어는 다음과 같습니다. 먼저 현재 클록 값에 대기하고자 하는 밀리초(x)를 더해 종료 시간을 계산합니다. 그다음 현재 시간이 종료 시간에 도달
C++에서 유니코드(Unicode) 문자를 출력하는 방법은 일반적인 문자 출력 과정과 매우 유사합니다. 핵심은 유니코드 코드 포인트 앞에 \u 접두사를 붙여 문자열 리터럴 안에 직접 작성하는 것입니다. 이렇게 하면 별도의 변환 과정 없이도 유니코드 문자를 성공적으로 화면에 출력할 수 있습니다.기본 원리C++11부터 문자열 리터럴 내에서 \uXXXX 형식을 사용하면 해당 16진수 코드에 대응하는 유니코드 문자가 자동으로 변환됩니다. 예를 들어 데바나가리 문자 म의 유니코드 값은 U+092E이므로, \u092E라고 작성하면 됩니다.주의
프로그램을 실행하는 동안 가상 메모리 사용량이나 상주 집합 크기(RSS, Resident Set Size) 같은 메모리 사용 정보를 실시간으로 확인할 수 있습니다. 이러한 정보를 얻으려면 운영체제에서 제공하는 시스템 라이브러리를 활용해야 하며, 구체적인 방법은 운영체제에 따라 달라집니다. 이 글에서는 Linux 환경을 기준으로 설명합니다.Linux에서는 /proc/self/stat 파일을 통해 현재 프로세스의 상세한 메모리 통계 정보를 얻을 수 있습니다. 여기서는 가상 메모리 크기(vsize)와 상주 집합 크기(rss) 두 가지 값
C++의 기본 자료형은 저장할 수 있는 값의 범위가 제한되어 있습니다. 예를 들어 long long 타입도 64비트 범위를 넘어서는 수는 표현할 수 없죠. 하지만 Boost 라이브러리를 사용하면 이러한 한계를 쉽게 극복할 수 있습니다.Boost는 C++ 생태계에서 가장 널리 사용되는 라이브러리 중 하나로, 다양한 분야에서 활용됩니다. 특히 Boost의 multiprecision 모듈을 이용하면 264를 훨씬 넘어서는 매우 큰 숫자도 문제없이 다룰 수 있습니다.고정 정밀도 정수 타입Boost 라이브러리는 int128_t, int256
이 글에서는 리눅스 환경에서 C++를 사용해 프로그램의 경과 시간 등 다양한 시간을 밀리초 단위로 구하는 방법을 알아보겠습니다.timeval 구조체와 gettimeofday 함수리눅스에서는 <sys/time.h> 헤더 파일에 정의된 timeval 구조체를 활용할 수 있습니다. 이 구조체는 시간을 초(tv_sec)와 마이크로초(tv_usec) 단위로 저장하며, gettimeofday() 함수를 호출하면 현재 시각을 손쉽게 얻을 수 있습니다.측정 원리는 간단합니다. 코드 실행 전에 시작 시간을 기록하고, 실행이 끝난 후 종료
C++에서는 클래스 객체를 두 가지 방식으로 인스턴스화할 수 있습니다. 하나는 new 키워드 없이 일반 변수처럼 선언하는 방법이고, 다른 하나는 new 연산자를 사용해 동적으로 메모리를 할당하는 방법입니다. 두 방식은 메모리가 저장되는 위치와 객체의 수명에서 중요한 차이를 보입니다. new를 사용하지 않는 경우: 스택(Stack) 할당 new를 사용하지 않고 객체를 생성하면, 해당 객체는 스택(stack) 영역에 저장됩니다. 이렇게 생성된 객체는 자신이 선언된 스코프(scope)가 끝나는 순간 자동으로 소멸되기 때문에, 개발자가
이 글에서는 리눅스 터미널에 색상이 적용된 텍스트를 출력하는 방법을 알아봅니다. 별도의 라이브러리나 복잡한 설정 없이, C++ 코드 안에서 간단한 터미널 제어 문자(ANSI 이스케이프 시퀀스)만 사용하면 누구나 쉽게 구현할 수 있습니다.기본 출력 형식터미널에 색상 텍스트를 출력할 때 사용하는 기본 명령 형식은 다음과 같습니다.\033[1;31m Sample Text \033[0m여기서 \033[는 이스케이프 시퀀스의 시작을 의미하고, 그 뒤의 숫자가 텍스트 스타일과 색상을 결정합니다. 마지막의 \033[0m은 스타일을 초기화하여 이
C++로 개발을 하다 보면 현재 컴파일러가 어떤 C++ 표준으로 동작하고 있는지 확인해야 할 때가 있습니다. 예를 들어 최신 문법(C++11 이후 기능)을 사용할 수 있는지 판단하거나, 여러 빌드 환경 간 호환성을 점검할 때 유용합니다.이런 정보는 __cplusplus라는 사전 정의 매크로(predefined macro)를 통해 손쉽게 얻을 수 있습니다. 이 매크로는 컴파일 타임에 해당 C++ 표준에 맞는 값을 자동으로 가지며, 표준별 값은 아래와 같습니다.표준__cplusplus 값C++98 이전 (비표준 C++)1C++98199
C++ 코드만으로도 콘솔 화면을 손쉽게 지울 수 있습니다. 핵심은 운영체제의 시스템 명령어를 실행하는 것이며, 이를 위해 C++ 표준 라이브러리에서 제공하는 system() 함수를 사용합니다.리눅스를 비롯한 POSIX 기반 시스템에서는 clear 명령어로 콘솔을 지울 수 있으며, 이 명령어 문자열을 system() 함수의 인자로 전달하기만 하면 됩니다.예제 코드#include <iostream> using namespace std; int main () { cout << Now the screen wil
이 글에서는 리눅스 환경에서 C++ 코드를 사용해 디렉터리 트리(directory tree)를 생성하는 방법을 알아봅니다.먼저 리눅스 터미널에서는 다음과 같은 명령어로 여러 단계의 하위 디렉터리를 한 번에 만들 수 있습니다.mkdir -p /dir/dir1/dir2여기서 -p 옵션은 부모(parent) 디렉터리를 의미하며, 존재하지 않는 상위 디렉터리까지 재귀적으로 모두 생성하도록 지시하는 역할을 합니다.C++ 코드에서 디렉터리 트리 생성하기C++ 코드에서도 리눅스 시스템 라이브러리를 활용할 수 있습니다. 가장 간단한 방법은 sys
C++에서 나노초(nanosecond) 단위의 정밀한 시간 측정이 필요하다면 chrono 라이브러리를 활용하는 것이 가장 좋은 방법입니다. 이 라이브러리에는 high_resolution_clock이라는 고해상도 시계가 내장되어 있어, 매우 짧은 시간 간격까지 정확하게 측정할 수 있습니다.기본적인 원리는 다음과 같습니다. 코드 실행이 시작되는 지점에서 현재 시각을 기록하고, 코드가 끝나는 지점에서 다시 시각을 기록한 뒤, 두 값의 차이를 계산하여 경과 시간(elapsed time)을 구합니다. 아래 예제에서는 대기 효과를 주기 위해