시작은 미미하나 끝은 쥬쥬하리라.

Develop

more

[C++] ABI와 opaque handle을 사용한 C++ ABI 호환성 유지

목차ABI응용/심화요약1. ABIABIABI(Application Binary Interface)는 실행 파일이 서로 맞물리는 바이너리 수준에서의 약속을 의미.API는 소스 코드 수준에서의 약속으로 API가 같더라도 ABI가 다르면 링크 / 호출 / 예외 전파가 실패하는 등의 문제 발생.-> dll, 플러그인 사용이 많은 산업 장비 분야에서 ABI는 품질의 핵심 축을 담당. API : 소스 레벨 인터페이스, 헤더 함수 혹은 클래스 시그니처, 맞물리지 않으면 컴파일 단게에서 에러 발생. ABI : 바이너리 레벨 인터페이스, 호출 규약 혹은 네임 맹글링, 레이아웃 등, 맞물리지 않으면 링크 또는 런타임 에러 발생. ABI 구성 요소1, Name Mangling(이름 맹글링)/* lib.c (C 컴파일) */..

Language - C++ 2026.01.29 0

[C++] 컴파일 과정과 번역 단위(TU), ODR의 관계

목차컴파일 과정응용/심화요약1. 컴파일 과정컴파일일반적으로 컴파일이라는 과정은 실제로 다음과 같은 파이프라인을 구성하고 있음.(1) 전처리 : #include, #define, 조건부 컴파일을 펼쳐서 TU(번역 단위)를 만듬.-> .i 파일 생성.(2) 컴파일 : TU를 최적화하고 경고/에러 처리를 하여 어셈블리어로 변환.-> .s 파일 생성.(3) 어셈블 : 어셈블리를 목적 파일로 변환. (섹션 / 심볼 테이블 생성)-> .o 파일 생성.(4) 링크 : 여러 목적 파일과 라이브러리를 결합하여 실행 파일 / 라이브러리를 생성 (exe / dll / so), 심볼 해석.-> .exe / dll 생성. ex) 컴파일 기본적인 흐름 예시(0) 소스 파일 Input.// add.h#ifndef ADD_H#d..

Language - C++ 2026.01.29 0

[C++] QueryPerformanceCounter() 함수와 QPC를 활용한 메모리 할당 전략 비교

목차QueryPerformanceCounter()와 profileapi.h 함수응용 / 심화요약1. QueryPerformanceCounter()와 profileapi.h 함수QueryPerformanceCounter() QPC라고 불리며 Windows의 profileapi.h 헤더에 포함된 고정밀 시간 측정 Windows API 함수.BOOL QueryPerformanceCounter( [out] LARGE_INTEGER *lpPerformanceCount); - 현재 성능 카운터 값을 반환. (CPU의 TickCount(클럭)를 반환)- 정밀한 시간 측정으로 성능 테스트에 필수.- LARGE_INTEGER 형의 정수 값 포인터를 파라미터로 받아 해당 파라미터에 결과 값을 반환.- 리턴에 성공하면 0..

Language - C++ 2026.01.28 0

[C++] 장비 인터페이스의 if / else 탈출

목차장비 제어에서 if / else 가 위험한 이유?디자인 패턴을 통한 장비 인터페이스 설계현대 C++에서의 장비 인터페이스 스타일1. 장비 제어에서 if / else 가 위험한 이유?HMI / SCADA 시스템을 개발하면 다양한 PLC 제조사들과 통신을 해야함. 각 제조사마다 통신 프로토콜과 데이터 구조가 다른데 제조사마다 if-else로 분기를 처리하면 아래와 같은 코드가 나옴. void ReadData(String sDeviceType, String sAddress) { if (sDeviceType == "Siemens") { // Siemens 통신 코드 } else if (sDeviceType == "Mitsubishi") { // Mitsubishi 통신 코드 ..

Language - C++ 2026.01.28 0

[C++] 메모리 / 핸들 누수 및 추적 도구

목차메모리 및 핸들 누수응용/심화요약1. 메모리 및 핸들 누수 누수 : 해제되지 않은 자원이 누적되어 성능 저하 혹은 크래쉬를 일으키는 현상.-> 메모리 누수와 핸들 누수는 원인이 다르므로 분리 접근하여야 함. Heap 누수 : 메모리 증가 혹은 느려짐 등의 증상이 있으며 원인은 new / malloc 후 해제되지 않은 경우. 핸들 누수 :파일, 소켓, 이벤트 그리고 가장 흔한 GDI/User 오브젝트 누수 등이 있으며 Windows OS는 프로세스 당 핸들 수 제한이 있어서 메모리가 넉넉하더라도 핸들이 고갈되면 새로운 윈도우를 띄우거나 통신을 할 수 없는 등의 증상이 발생. 원인으로는 CloseHandle 누락이 대표적. 리소스 오염 :공유 자원을 획득만 하고 해제하지 않아 발생, 자원은 획득하였으나..

Language - C++ 2026.01.25 0

DevOps

more

[네트워크] DNS(Domain Name System)과 현장 DNS 관련 이슈

목차DNS응용/심화요약1. DNSDNS(Domain Name System)은 인터넷 전화번호를 의미. 컴퓨터는 통신할 때, 142.250.207.14 같은 IP 주소를 사용. 사람은 google.com과 같은 도메인 이름을 사용.=> DNS는 사용자가 도메인을 입력하면 이를 컴퓨터가 이해할 수 있는 IP 주소로 변환해주는 시스템과 규칙. DNS 구성 요소1. 도메인 네임 스페이스(Domain Name Space)데이터가 저장되는 계층적 구조, '.'일 기준으로 계층이 구분. 2. 네임 서버(Name Server)특정 도메인이 특정 IP라는 정보를 실제로 저장하고 관리하는 데이터베이스 서바 3. 리졸버(Reslover)사용자의 요청을 받아서 네임 서버에 값을 요청/반환 받는 중개 역할, 통신사(ISP) ..

[Window OS] IsWindow(), IsWindowVisible()과 이를 활용한 외부 프로세스 감시

목차IsWindow(). IsWindowVisible()응용/심화요약1. IsWindow(), IsWindowVisible()IsWindow()BOOL IsWindow( [in, optional] HWND hWnd); 전달 받은 핸들이 시스템에 등록된 유효한 윈도우인지 확인.-> 윈도우가 최소화 되어 있건, 투명하건, 다른 창에 가려져 있건 상관없이 객체가 유효하다면 TRUE를 반환.-> 윈도우가 닫히고, 핸들이 무효화된 후 OS가 우연히 같은 핸들 값을 다른 윈도우에 할당할 수 있음, 따라서 이 함수만으로 내가 찾던 윈도우임을 100% 확신하기 위한 용도보다는 예외 방지용으로 주로 사용. IsWindowVisible()BOOL IsWindowVisible( [in] HWND hWnd); 전달 받은..

[네트워크] TCP / UDP 프로토콜과 TCP 프로토콜의 동적 포트 고갈

목차 TCP / UDP응용/심화요약1. TCP / UDPTCP(Transmission Control Protocol)연결 지향형으로 데이터를 보내기 전에 상대방과의 연결 과정인 3-Way Handshake 과정을 거침.-> 1:1 통신, 에러 및 흐름 제어-> 헤더가 20-60바이트 정도로 무거움.장점 : 데이터가 유실되면 제전송하고, 순서가 바뀌면 바로잡아주어 신뢰성을 보장.단점 : 확인 절차가 있어 UDP보다 느리고 오버헤드가 큼. UDP(User Datagram Protocol)비 연결형으로 상대방의 데이터 수신 준비 여부를 묻지 않고 데이터를 전송.-> 1:1, 1:N, N:N 통신, 에러 체크 미비.-> 헤더가 8바이트로 가벼움.장점 : 구조가 단순하고 확인 절차가 없어 매우 빨라, 실시간성이 ..

[네트워크] OSI 7계층 정리

목차OSI 7계층응용/심화요약1. OSI 7계층OSI 7계층 :국제표준화기구(ISO)에서 정의한 네트워크 표준 모델로, 통신이 일어나는 과정을 7단계로 구조화한 것. 7단계로 구분한 이유1. 유지보수의 독립성-> 특정 영역에 이상이 생기면 다른 단계의 장비나 소프트웨어를 건드리지 않고 문제가 발생한 계층만 수정해여 해결 하기 위함. 2. 표준화와 이해도-> 통신 흐름을 파악하기 용이하기, 서로 다른 제조사 장비 간의 호환성을 보장. 3. 캡슐화-> 송신 측은 상위에서 하위로 내려가며 헤더를 붙이고, 수신 측은 하위에서 상위로 올라가며 헤더를 제거하며 데이터를 처리. 1계층 - 물리 계층데이터를 전기적, 기계적 신호(비트열)로 변환하여 통신 케이블로 전송.데이터가 무엇이고 에러가 있는지 여부는 판단하지 ..

[AI] 임베딩(Embedding)의 개요

목차임베딩응용/심화요약1. 임베딩(Embedding)일반적으로 임베딩은 단어나 문장을 수치화 시켜주는 작업으로 사용.-> 구체적으로는 단순 데이터 변환이 아닌 의미의 공간적 배치. 자연어(텍스트)를 고정된 길이의 실수 배열(Vector)로 변환하는 기술.-> 비슷한 의미를 가진 단어나 문장은 벡터 공간상에서 서로 가까운 거리에 위치하게 만드는 것.ex) 정지 버튼과 STOP이라는 단어는 컴퓨터가 받아들이기에는 전혀 다른 데이터지만, 임베딩 후 벡터 좌표는 매우 근접하게 위치. LLM 프로세스에서의 임베딩LLM은 보통 다음과 같은 시퀀스를 통해 입출력을 처리함. 자연어 입력 -> 토큰화 -> 임베딩 -> AI 모델 연산 -> 자연어 출력 사용자가 프롬프트 등을 통해 자연어를 입력하면, 이를 문장에서 단어..

Knowledge - AI 2026.03.24 0

DevKit

more

[Qt] Shadow Build

목차Shadow Build응용/심화요약1. Shadow BuildShadow Build는 Qt에서 사용되는 Out of Source 형태의 빌드 종류임.Out of Soruce : 소스 폴더 외부의 별도 디렉토리에 산출물을 분리하는 빌드 종류.-> Qt의 qmake는 빌드 산출물을 특정 디렉토리로 모을 수 있는데 shadow build는 자동적으로 이 구조를 만듬. 빌드 산출물 분리의 장점(1) 빌드 환경에 폴더로 분리.-> 특정 폴더를 그대로 보존하여 버그 재현에 용이.(2) Debug / Realese 동시 보유.-> 각 모드의 전환 비용이 감소.(3) 워크스페이스 정리 단순.-> CI 측면에서 캐시 / 아티팩트 등 관리가 용이함. 2. 응용/심화상대 경로와 생성 파일Qt 빌드는 moc / uic /..

IDE - QT 2026.02.03 0

[RAD Studio] FastMM을 통한 메모리 관리

목차FastMMFastMM 설치 및 환경 설정FastMM을 통한 메모리 관리FastMM 환경 설정 관련 오류 해결1. FastMMFastMM은 Windows용 메모리 관리자로 델파이에서 사용 가능한 메모리 관리자임.FastMM 라이브러리를 프로젝트에 포함하게 되면 기존과 new / delete 하는 코드는 동일하나 내부적으로 컴파일 단게에서 메모리 할당과 해제 코드의 앞뒤에 가드 패턴을 삽입하여 메모리를 관리. - 옵션은 .inc 파일을 사용자가 직접 수정하여 라이브러리와 동일한 경로에 위치시키면 컴파일 단계에서 해당 inc 파일을 참조. 2. FastMM 설치 및 환경 설정본문에서는 FastMM4를 사용하며, 해당 파일 패키지는 검색을 통해 쉽게 찾을 수 있음. - 다운받은 파일을 확인하면 상위의 Fa..

IDE - RAD 2026.01.28 0

[QT] Qt4 - 기본 웹 브라우저로 설정한 URL 열기

기본 웹 브라우저로 설정한 URL 열기 코드 startDetached() 코드 미리 정의한 URL을 기본 브라우저로 오픈하는 코드를 구현해보겠습니다. URL을 미리 정의하고 기본 브라우저에서의 오픈은 startDetached() 함수로 구현하였습니다. int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QString Url = "https://naver.com/"; QProcess::startDetached("cmd /c start " + Url); return a.exec(); } 해당 로직은 main 함수에서 구현하였기 때문에 프로젝트를 실행하면 그 즉시 naver.com 도메인으로 연결됩니다. startDetached() start..

IDE - QT 2024.01.18 0

[QT] Qt4 - 단축키로 파일 오픈하기

단축키로 파일 오픈하기 단축키 구현 결과 단축키 구현 Qt4에서 단축키 관련 메서드를 이용하여 특정 문서를 오픈할 수 있는 방법은 많습니다. 저는 오늘 그 중에서 두 가지 방법을 보여드리려 합니다. 첫 번째 방법은 단축키를 누르면 문서 파일이 직접적으로 오픈되는 방법입니다. 두 번째 방법은 단축키 클릭 시, 파일 브라우저를 오픈하는 방법입니다. 아래는 코드입니다. #include #include #include #include #include #include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setup..

IDE - QT 2024.01.18 0

[QT] Qt4 - List 데이터에서 특정 단어의 빈도수 산출하기

Qt4 데이터에서 특정 단어 빈도수 산출하기 코드 구현 결과 코드 구현 데이터를 QStringList 형식이라 가정하고 진행해보겠습니다. 저는 미리 QStringList 형식의 데이터를 선언했습니다. 저는 이 List가 가진 데이터 중 title이라는 key값의 value에 해당하는 데이터만을 1차적으로 추출하고 이들을 대상으로 빈도수를 산출하겠습니다. #include #include #include #include #include #include #include #include int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 데이터 List. QStringList qList; qList

IDE - QT 2024.01.18 0

Study

more

[열혈 C++ 프로그래밍] (16) C++ 형 변환자

C언어 기반 C++ 2 형 변환 연산1 형 변환 연산2 형 변환 연산3 형 변환 연산1 C++ 형 변환 다운 캐스팅 등 문법적으로 에러가 있더라도 컴파일 에러를 일으키지 않고 형 변환 연산 처리 C++의 형 변환 : 4가지의 종류로 분할하여 사용 -> 각 종류 별 케이스에 일치하지 않으면 컴파일 에러 발생, 문법적 오류 발견 가능 1. static_cast 2. const_cast 3. dynamic_cast 4. reinterpret_cast dynamic_cast(안전성 보장) static_cast(안전성 미 보장) 형 변환 연산2 dynamic_cast 포인터 또는 참조자를 T형으로 변환하되, 안전한 형 변환만을 허용 ex) B클래스의 기초 클래스 A클래스일 때, B클래스의 포인터를 A클래스의 포인..

[열혈 C++ 프로그래밍] (15) 예외처리

예외처리 예외 상황, 예외 처리 예외처리 메커니즘 Stack Unwinding 예외상황 표현하는 예외 클래스 설계 예외처리 예외 상황, 예외 처리 예외 상황 문법적 오류가 아닌 프로그램 논리에 맞지 않는 오류 ex) 나이 입력 : 0보다 작은 값 입력 -> 예외 상황 예외 처리 조건문을 통해 예외를 발견하고 처리가 가능하지만 이러한 방식은 예외처리부와 일반 코드를 쉽게 구분 불가 -> C++에서 별도 메커니즘 제공 : try, catch, throw 예외처리 메커니즘 try, catch, throw try 블록에서 발생한 예외는 catch 블록에서 처리 try : 예외 발생의 검사 범위를 지정, 예외가 발생할 가능성이 있는 코드 블록 catch : try블록에서 발생한 예외를 처리, 예외 핸들러가 처리할..

[열혈 C++ 프로그래밍](14) 템플릿 2

템플릿 2 내용 확장 클래스 템플릿의 특수화 템플릿 인자 템플릿과 static 내용 확장 const 변수, 객체의 상수화 키워드 클래스 템플릿의 특수화 템플릿 컴파일러가 클래스를 만드는데 사용되는 템플릿을 정의 -> 컴파일러가 템플릿을 확인하고 템플릿 기반 클래스를 생성 -> 템플릿 클래스에서 객체를 생성 BoundCheckArray iarr(50); BoundCheckArray oarr(50); -> 와 같이 객체 생성 가능 Point int형 : BoundCheckArray로 객체 생성 -> typedef Point* POINT_PTR; = BoundCheckArray oparr(50);과 동일 + 템플릿 클래스 자료형을 대상으로 일반함수 정의 가능 + 클래스 템플릿 내부에서 일반 함수를 대상으로 f..

[열혈 C++ 프로그래밍] (13) 템플릿 1

템플릿 1 템플릿과 함수 템플릿1 템플릿과 함수 템플릿2 클래스 템플릿 템플릿 일부만 결정되어 있고 나머지는 사용하는 순간에 결정되는 것 -> 함수의 기능은 결정되어 있지만 자료형이 결정되어있지 않고 의존적이지 않은 것 int add(int a, int b) { return a+b } -> double형 데이터를 대상으로 연산하지 못함 -> double형 데이터를 int형으로 캐스팅하여 연산 할 수 있지만 데이터 손실 발생 -> double형 데이터 연산을 하는 함수 작성 필요 -> 자료형 마다 함수를 추가 작성하는 것이 비효율적이라서 템플릿 사용 T add(T a, T b) { return a+b } -> 함수 템플릿 -> T가 어떤 것인지 컴파일러가 알 수 있게 명시 + template {typena..

[열혈 C++ 프로그래밍] (12) String 클래스 디자인

String 클래스 디자인 C++표준, string클래스 문자열 처리 클래스 C++ 표준, string 클래스 String 문자열 처리를 위해 제공되는 클래스, string.h 헤더 파일을 포함해야 사용 가능 string str1 = "a"; string str2 = "b"; string str3 = str1 + str2; -> str1.operator+(str2);를 호출 : operator+() 함수는 string.h 헤더 파일에 정의 -> operator+() 이외에도 문자열과 관련한 operator+=(), ==() () 등의 함수가 정의 문자열 처리 클래스 length() 문자열의 길이를 반환하는 stirng 메소드 size()메소드도 길이를 반환하고 같은 값을 반환하지만, size는 객체가 메..

반응형