Programming 88

[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

[Qt for Android] 카메라 영상 확인을 위한 yuv raw 데이터 저장 및 프레임 확인하기

안녕하세요. 안드로이드 카메라 영상(yuv) 프레임 데이터를 출력하면서 저장된 프레임이 잘 나오지 않아서 확인해 보았습니다. 테스트 환경은 Qt Creator와 Qt for Android(6.8.3), galaxy S20을 이용했습니다. 1. yuv Raw 데이터 저장 카메라 영상을 가지고 오는 로직은 제외했습니다. 영상 데이터가 전달되었다고 생각이 드는데, 영상이 나오지 않는다면, 간단하게 첫 프레임을 저장해서 확인해 보는 것입니다. void VideoWidget::slotImageReady(uint8 * data, int size, int width, int height, int format, int bpl){ QMutexLocker locker(&m_mutex); if (!i..

Programming/Qt 2025.06.22

[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

[Qt] github에 push 하기 위한 win-ssh-askpass 대안 qtc-askpass

안녕하세요. github에 push 하기 위해 ssh-key 생성 시 암호를 설정했다면, Qt에서 원격지로 전송할 때 암호창이 나타나지 않아서 bash에서 수동으로 passphrase(암호)를 입력하는 경우 있을 겁니다. 설정창에는 기본으로 win-ssh-askpass 실행파일로 되어 있는데, 파일이 다운로드하거나 찾을 수 없어서 bash로 하는 경우가 있는데, qt에서 지원해 주는 ssh 암호창이 있어 공유해 봅니다. 1. github에 push 할 경우 문제 상황 로컬에서 git을 사용할 때는 원격지 전송이 필요하지 않기 때문에 문제가 없지만, 원격지로 push 하면 아래와 에러가 발생합니다. 특별한 설정을 하지 않았다면, win-ssh-askpass를 찾아 시도하지만, 파일이 없다고..

Programming/Qt 2025.06.08

[Qt] gRPC, Protocol Buffers 사용 시 라이브러리 추가 방법

안녕하세요. 두 개 이상의 프로그램 상에서 구조화된 데이터를 보낼 때 Serialized 해서 네트워크로 보냅니다. 최근에 구글에서 효율적인 데이터를 직렬화와 서비스 간 통신을 가능하게 해주는 기술(gRPC, Protocol Buffers)이 있다고 해서 확인해 보았습니다. 간단하게 내용을 확인하고 Qt에서 라이브러리 추가하는 방법 알아보겠습니다. 1. gRPC와 Protocol Buffers 간략한 개념 1) gRPC 란 gRPC는 Google이 개발한 고성능 오픈소스 원격 프로시저 호출(Remote Procedure Call, RPC) 프레임워크입니다. 서비스 간의 통신을 마치 로컬 함수 호출처럼 수행할 수 있도록 설계했고, 몇 가지 특징이 있습니다. HTTP/2 기반의 고속 전송..

Programming/Qt 2025.05.29

[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

[Qt] C++ 컨테이너 순회, '범위 기반 for' 사용 및 최적화 방법

안녕하세요. Qt/C++로 코딩하다 보면 std::vector나 QList 같은 컨테이너 안의 데이터들을 하나씩 검색 혹은 출력할 때가 있습니다. 예전에는 foreach (또는 Qt의 Q_FOREACH) 같은 방식을 쓰기도 했지만, 요즘 C++에서는 훨씬 더 깔끔하고 효율적인 방법이 있습니다. 바로 '범위 기반 for 루프'입니다. 이것을 사용하면 조금 더 코드가 좋아지는 이유와 Qt 사용자를 팁을 하나 공유해 보고자 합니다. 1. 예전 방식의 foreach, Q_FOREACH 예전에 쓰던 foreach나 Qt의 Q_FOREACH는 특정 컨테이너들을 순회할 때 편리했지만, 몇 가지 불편한 점이 있습니다. 모든 C++ 환경에서 똑같이 돌아가지 않을 수 있었고, 내부 동작이 복잡해서 코드를 읽거나 문..

Programming/Qt 2025.05.14

[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

How to Resolve Warning Messages When Adding Header Files in Qt 6.8.1

Hello,  I'd like to share how to resolve the persistent warning messages that appear when adding header files while using Qt 6.8.1. 1. Warning Message Even when creating a basic Qt widget project, the following warning message appeared (with QMake configuration): D:\project\02_qt\01_error_test01\widget.cpp:2:warning: Included header ui_widget.h is not used directly (fix available)    I thought i..

Programming/Qt 2025.04.08

[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