Programming/C, C++ 17

[C++] if 조건문과 암시적 bool 형변환에 대해 이해하기

안녕하세요. C++에서 if(expression) 문은 가장 기본적인 제어문 하나입니다. 우리는 보통 표현식(expression) 자리에 true 또는 false를 반환하는 비교 연산(i > j 등)이 알고 있습니다. 하지만 C++의 if문은 생각보다 훨씬 유연하게 동작합니다. 그리고 바로 그 부분이 미묘한 버그의 원인이 되기도 합니다. 이번 글에서는 if문의 조건식이 어떻게 평가되는지, 그리고 C++11의 explicit 키워드가 사용하기 전에 개발자들이 bool 타입에 대한 내용에 대해 재미 삼아 알아보겠습니다. 1. 숫자와 포인터도 받아주는 if문 C++의 if문은 조건식의 결과가 꼭 bool 타입일 필요가 없습니다. 0이 아닌 숫자나 null이 아닌 포인터 등 참(true)으로 평가될 ..

Programming/C, C++ 2025.06.26

[C++] shared_ptr (1) - 필요성에 대해 알아보기

안녕하세요. C++에서 메모리 관리는 중요한 요소 중 하나입니다. 특히 new와 delete를 사용하여 직접 메모리를 할당하고 해제하는 방식은 유연성을 제공하지만, 동시에 다양한 문제점을 야기할 수 있습니다. 이번 글에서는 이러한 문제를 해결하기 위한 방법 중 std::shared_ptr에 대해 알아보겠습니다. 1. shared_ptr란 무엇일까요? std::shared_ptr는 C++11부터 표준 라이브러리에 포함된 스마트 포인터(Smart Pointer)의 한 종류입니다. 스마트 포인터는 이름 그대로 일반적인 "날 것의 포인터(raw pointer)"가 가지고 있는 단점을 보완하기 위해 만들어진 객체 래퍼(object wrapper)입니다. shared_ptr의 핵심은 참조 횟수(refer..

Programming/C, C++ 2025.06.20

[C++] Thread Local Storage (TLS)인 thread_local 대해 알아보기

안녕하세요. C++ 프로젝트를 진행하시면서 스레드별로 독립적인 데이터를 관리해야 할 때가 있습니다. 바로 그럴 때 사용할 수 있는 Thread Local Storage (TLS) 방법이 있어, 간단하게 알아보겠습니다. 1. Thread Local Storage (TLS)란? Thread Local Storage (TLS), 우리말로는 스레드 지역 저장소라고 부릅니다. 이름에서 알 수 있듯이, 각 스레드(Thread)가 독립적인 저장 공간을 갖는 기능입니다. 일반적으로 전역 변수나 정적(static) 변수는 프로세스 내의 모든 스레드가 공유합니다. 이 때문에 여러 스레드가 동시에 공유 변수에 접근하여 값을 변경하면, 의도치 않게 경쟁 상태(Race Condition)가 발생할 수 있습니다. 물..

Programming/C, C++ 2025.06.12

[C++]컨테이너(Container)와 이터레이터(Iterator) 기초 2

안녕하세요 지난 글에는 C++의 컨테이너와 이터레이터가 무엇인지, 어떻게 사용하는지에 대해 알아보았습니다. 이번에는 조금 컨테이너와 이터레이터가 내부적으로 어떻게 동작하는 알아보겠습니다. 1. 컨테이너에 [] 연산자 사용 std::vector를 사용할 때, 우리는 배열처럼 v[i] 형태로 특정 위치의 요소에 매우 편리하게 접근할 수 있습니다. 이유는 연산자 오버로딩(Operator Overloading) 때문입니다. []는 C++ 클래스에서 특별한 함수(멤버 함수)로 직접 구현할 수 있는 연산자 중 하나입니다. 원리를 확인하기 위해, std::vector를 아주 간단하게 흉내 낸 ThingVector라는 클래스를 만들어 보겠습니다. templateclass ThingVector {priv..

Programming/C, C++ 2025.05.23

[C++] 컨테이너(Container)와 이터레이터(Iterator) 기초 1

안녕하세요 이번에는 C++의 개념 중에 컨테이너(Container)와 이터레이터(Iterator)의 기본 정의와 사용법에 대해 알아보겠습니다. 1. 컨테이너(Container)란? 이전 내용에서 몇 번 언급했지만, 정의에 해대서 다시 알아보겠습니다. C++에서 컨테이너는 동일한 타입의 여러 객체(데이터)들을 담는 자료구조라고 생각하면 쉬울 것입니다. 마치 물건을 담는 상자처럼, 컨테이너는 숫자, 문자열, 또는 사용자가 만든 객체들을 보관하고 관리하는 역할을 합니다. C++ 표준 템플릿 라이브러리(Standard Template Library, STL)는 다양한 종류의 컨테이너를 제공합니다. 대표적으로는 다음과 같은 것들이 있습니다. std::vector : 동적으로 크기가 변하는 배열 st..

Programming/C, C++ 2025.05.22

[C++] 타입 캐스팅 (static_cast, dynamic_cast) 대하여

안녕하세요, 1. C++ 타입 캐스팅 필요성 C++은 타입 시스템을 가지고 있어, 서로 다른 타입 간의 데이터 교환이나 연산을 엄격하게 제한합니다. 하지만 때로는 프로그래머의 의도에 따라 타입을 변환해야 하는 경우가 발생합니다. 예를 들어, 부모 클래스 포인터가 실제로는 자식 클래스 객체를 가리키고 있을 때, 자식 클래스 고유의 멤버에 접근하려면 타입 변환이 필요합니다. 이럴 때 사용하는 것이 바로 타입 캐스팅 연산자입니다. C++ 에는 크게 네 가지의 명시적 타입 캐스팅 연산자가 있습니다. (1) static_cast(표현식) (2) dynamic_cast(표현식) (3) const_cast(표현식) (4) reinterpret_cast(표현식) 각각의 캐스팅 연산자는 사용 목적과 특징이 다르..

Programming/C, C++ 2025.05.10

[C++] 함수 템플릿 기초와 Name Mangling (Name Decoration) 대해 알아보기

안녕하세요. C++로 프로그래밍하다 보면, 비슷한 로직인데 처리하는 데이터 타입만 다른 함수를 여러 개 만들어야 할 때가 있습니다. 예를 들어, 두 개의 정수를 더하는 함수 add_int(int a, int b)와 두 개의 실수를 더하는 함수 add_float(float a, float b) 코드로 나눠져 있다면, 코드가 중복되고 관리하기 번거로울 것입니다. C++은 함수 템플릿(Function Template)이라는 함수 템플릿을 사용하면, 타입에 구애받지 않는 함수 "틀"을 만들어 놓고, 컴파일 시점에 실제 필요한 타입의 함수를 자동으로 생성하게 할 수 있습니다. 이미 알게 모르게 사용하고 있을 수 있지만, 기초 방법과 연계해서 +1 지식을 알아보도록 하겠습니다. 1. 함수 템플릿이란? ..

Programming/C, C++ 2025.05.03

[C++] 연산자 오버로딩(Operator Overloading)에 대해 좀 더 알아보기

안녕하세요. 이번에는 C++의 기능 중 하나인 연산자 오버로딩(Operator Overloading)에 대해 알아보겠습니다. 연산자 오버로딩을 언제 사용하는 거야?라고 할 수 있습니다. 그러나 직접 객체 간 연산(?)을 하지 않는 코드라면 사용하지 않았을 수도 있습니다. 그러나 연산자 오버로딩을 사용하면 사용자 정의 클래스(우리가 직접 만든 타입)에 대해서도 `+`, `-`, `=`, ` 마치 int나 float 같은 기본 타입처럼 객체를 다룰 수 있어 코드의 가독성과 직관성을 크게 높일 수 있습니다. 1. 연산자 오버로딩이란? 함수 오버로딩은 이름이 같은 함수라도 매개변수의 타입이나 개수가 다르면 여러 개 정의할 수 있는 기능이라고 자주 들어 봤을 겁니다. 마찬가지로, 연산자 오버로딩은 기..

Programming/C, C++ 2025.04.29

[C++] using 정의와 추가적인 기능 알아보기

안녕하세요. using 키워드를 쉽게 namespace 활성화로만 사용하고 있다는 생각에, 추가적인 기능에 대해 알아보았습니다. using은 코드의 가독성을 높이고, 특히 네임스페이스 관리와 클래스 상속 관계에서 발생하는 미묘한 문제들을 해결하는 데 중요한 역할을 합니다. 1. using 기본 기능 - 네임스페이스 활성화 C++에서는 이름 충돌을 방지하고 코드를 모듈화 하기 위해 네임스페이스(namespace)를 사용합니다. 예를 들어, C++ 표준 라이브러리의 대부분 기능은 std 네임스페이스 안에 정의되어 있습니다. #include #include int main() { std::cout numbers; return 0;} 매번 std::를 붙이는 것은 번거로울 수 있습니다. 이때 ..

Programming/C, C++ 2025.04.25

[C++] namespace 사용법 읽을거리

안녕하세요. C++ 프로그래밍에서 코드의 규모가 커지거나 여러 라이브러리를 사용할 때 발생할 수 있는 이름 충돌(Name Collision) 문제이 발생하기도 하고, 코드를 논리적으로 구분할 때 namespace를 사용할 텐데요. 조금 알아보겠습니다. 1. namespace란 무엇이고 왜 사용할까? C++ 프로젝트를 진행하다 보면, 내가 만든 함수나 변수 이름이 다른 라이브러리나 팀원이 만든 코드의 이름과 겹치는 경우가 생길 수 있습니다. 예를 들어, print()라는 함수를 여러 곳에서 정의한다면 컴파일러는 어떤 함수를 호출해야 할지 알지 못해 오류를 발생합니다. namespace는 이러한 이름 충돌 문제를 해결하기 위해 도입된 문법입니다. 특정 코드 영역을 고유한 이름 공간(namespace..

Programming/C, C++ 2025.04.23

[C++] 동적 바인딩과 가상 함수에 대한 짧게 읽을거리

안녕하세요. 이번에는 C++ 동적 바인딩과 이를 가능하게 하는 가상 함수 개념에 간단하게 확인해 보겠습니다. 1. 동적 바인딩 (Dynamic Binding) 이란? 동적 바인딩 또는 늦은 바인딩 (Late Binding)은 실행 시점(Runtime)에 호출될 함수를 결정하는 방식입니다. 이는 컴파일 시점에 호출될 함수가 결정되는 정적 바인딩 (Static Binding)과 대조가 되는 개념입니다. C++에서는 주로 가상 함수 (Virtual Functions)를 통해 동적 바인딩을 구현합니다. 2. 가상 함수 (Virtual Functions) 이전 글에서도 한번 설명하였습니다. 가상 함수는 기반 클래스에서 virtual 키워드를 사용하여 선언된 함수입니다. 파생 클래스에서 이 가상 함수를 ..

Programming/C, C++ 2025.04.17

[C++] explicit에 대해 알아두면 좋은 읽을거리

안녕하세요.  C++를 사용하다 보면 "explicit" 키워드를 가끔 보게 됩니다. 이 키워드는 클래스 생성자의 동작 방식을 제어하는 중요한 역할을 하지만, 처음 접하는 분들에게는 다소 낯설게 느껴질 수 있습니다.  이번 내용은 C++의 "explicit" 문법에 대해 조금 알아보려고 합니다.  1. 암시적 형 변환 (Implicit Type Conversion)  "explicit" 키워드를 이해하기 위해서는 먼저 C++의 암시적 형 변환에 대한 이해가 필요합니다. C++에서는 컴파일러가 특정 상황에서 자동으로 자료형을 변환해 주는 암시적 형 변환이 일어납니다.  클래스 타입 인자가 하나인 생성자가 정의되어 있다면, 해당 생성자를 사용하여 다른 타입의 값을 클래스 타입으로 암시적으로 변환할 수 있습니..

Programming/C, C++ 2025.04.11

[C++] 가상 함수에서 조금 알아두면 좋은 간단한 읽을거리(vtable, pure virtual function 포함)

안녕하세요.  C++ 가상 함수에 대해서 조금 알아보려고 합니다. 뭐 virtual 만 붙이면 되는 거 아니야?라고 할 수 있지만, 간단한 원리, vtable 구조, 장단점 등을 조금 알아보겠습니다.  C++에서 가상 함수(virtual function)는 객체 지향 프로그래밍의 다형성(polymorphism)을 구현하는 핵심 개념입니다. 이를 통해 기본 클래스 포인터 또는 참조를 사용하더라도, 런타임에 실제 객체의 타입에 따라 적절한 함수가 호출되도록 만들 수 있습니다.   1. 가상 함수란? — 런타임 다형성의 시작  가상 함수는 기본 클래스에서 virtual 키워드로 선언되며, 파생 클래스에서 재정의(override)할 수 있습니다. 가상 함수 호출은 정적 바인딩(static binding)이 아닌..

Programming/C, C++ 2025.04.05

[C++] 복사 생성자에서 조금 알아두면 좋은 간단한 읽을거리 (깊이 있는 이해)

안녕하세요.   생성자에도 몇 가지 종류가 있는데 그중에 복사 생성자에 대해서 조금 더 알아보겠습니다.  C++에서 복사 생성자는 객체를 복사하여 새로운 객체를 생성할 때 호출되는 특별한 멤버 함수입니다. 복사 생성자를 적절히 사용하는 것은 C++ 프로그래밍의 핵심이며, 특히 객체의 메모리 관리를 이해하는 데 중요합니다. 이 글에서는 복사 생성자의 기본 개념부터 고급 활용 부분까지 살펴보겠습니다.  1. 변수 초기화에 스타일  변수 초기화할 때 C++ 에는 C와 조금 다른 방식이 추가되어 있습니다. 바로 ( ) 괄호입니다. 여기서 명시적(직접) 초기화 방식과 묵시적(암시적) 방식에 따라 조금 차이가 있어서 미리 조금 알고 있으면 도움 될 것이 있어서 적어보았습니다.  int count = 0;int &r..

Programming/C, C++ 2025.04.03

[C++] 생성자(Constructor)에서 조금 알아두면 좋은 읽을거리

안녕하세요.  C++언어를 알고 있는 분이라면, 생성자와 소멸자에 대해서 기본적인 것은 다 잘 알고 있을 거라고 생각합니다. 그중에서 한 번쯤 다시 기억하고 있으면 좋은 것에 대해서 공유해 보겠습니다.   1. 생성자(Constructor)에 관해  생성자(Constructor)라고 하면 기본적으로 객체가 생성될 때 자동으로 호출되는 특수한 멤버 함수입니다. 아래와 같은 기본적인 특징을 가지고 있습니다.  클래스와 같은 이름을 가지며 반환형이 없다. 객체 초기화를 담당한다. 매개변수를 받을 수 있으며, 여러 개의 생성자를 오버로딩할 수 있다.  1) 생성자 인자  생성자 인자가 다르면 디폴트 생성자의 형태도 같아야 합니다. 함수 오버로딩과 비슷할 수 있는데 객체 생성할 때 생성자도 이것을 지켜야 합니다...

Programming/C, C++ 2025.04.01

Visual Studio(VC++)에서 빌드 시 한글 때문에 에러가 발생과 콘솔(디버깅) 창에 한글이 깨져 나올 경우

안녕하세요.  최근에 Qt로 작업하다가 다시 Visual Studio 2022(VC++)로 확인할 것이 있어 설치해서 소스코드를  확인하다가 한글 출력에 이슈가 있어서 확인한 내용을 남깁니다.  이미 다른 분들도 올린 내용이 있지만, 한글 처리 부분에도 여러 가지 경우가 있다 보니 그중에 이와 유사한 경우가 있지 않을까 해서 정리해 보았습니다.  1. 문제 되는 부분 1   VC++ 코딩 중에 간단하게 printf로 한글을 출력을 출력하려고 간단하게 코드를 작성합니다.    확인 삼아 컴파일을 해보니, 아래와 같이 에러가 발생했습니다. 한글만 없으면 문제없이 컴파일이 되었습니다.  "파일에 0x64 오프셋에서 시작하는 문자가 포함되어 있습니다. 이 문자는 현재 원본 문자 집합에서 잘못된 문자입니다(코드 ..

Programming/C, C++ 2025.03.29

[C++] struct와 class 차이

안녕하세요.    AI가 코딩을 대신해 주고 편리함을 주고 있어 긍정적인 일이기도 하지만, 개발자라서 기본을 놓이고 너무 의존만 하는 것 같아서 다시 기본으로 돌아가보자는 생각으로 기초적인 다시 내용들을 정리해보려고 합니다.   프로그램 언어는 어떤 곳에서 사용하느냐에 따라서 Python, Java, Ruby, R 등 여러 가지 언어가 있지만, 임베디드를 개발하는 곳에서는 아직 C와 C++ 이 상당 부분 차지하고 있습니다.   그중에 C언어에서 C++로 넘어왔다면 클래스와 객체지향 등 여러가지 용어를 들어 보았을 것입니다. Class는 C++에서 중요한 역할을 하고 있습니다.  그런데 한번쯤 C++에서 struct와 class가 무슨 차이가 있을까 생각을 했을 수도 있습니다. 왜냐하면, struct 안에..

Programming/C, C++ 2025.03.28