delphi634 컴파일러 지시자(Conditional Defines)를 활용한 플랫폼별 코드 최적화 컴파일러 지시자(Conditional Defines)를 활용한 플랫폼별 코드 최적화델파이는 단일 코드 베이스로 Windows, macOS, iOS, Android 등 멀티 플랫폼 앱을 개발할 수 있는 환경을 제공합니다. 하지만 특정 OS 전용 API를 호출하거나 하드웨어 가속 성능을 최대로 끌어올리기 위해서는 해당 플랫폼에서만 실행될 코드를 분리해야 합니다. 컴파일러 지시자(Compiler Directives)를 사용하면 컴파일 타임에 조건에 맞는 코드만 바이너리에 포함시키므로, 실행 시점의 오버헤드 없이 최적화된 앱을 제작할 수 있습니다. program PlatformOptimization; {$APPTYPE CONSOLE} uses System.SysUtils, {$IFDEF MS.. 2026. 4. 13. RTTI를 활용한 속성(Property) 동적 읽기와 설정하기 RTTI를 활용한 속성(Property) 동적 읽기와 설정하기Delphi에서 일반적으로 객체의 속성(Property)에 접근할 때는 컴파일 시점에 타입이 결정됩니다. Edit1.Text := 'Hello'; 하지만 런타임에 객체의 속성을 동적으로 읽거나 변경해야 하는 경우도 많습니다. 예를 들어 JSON → 객체 자동 매핑 설정값 자동 적용 공통 UI 처리 로직 ORM 스타일 데이터 바인딩 이럴 때 사용하는 것이 RTTI(Runtime Type Information)입니다. 클래스의 타입 정보 런타임 조회 속성(Property), 메서드(Method) 접근 가능 문자열 기반으로 속성 접근 가능 동적 프로그래밍 구현 가능 program RTTITip; {$APPTYPE CONSOLE} uses S.. 2026. 4. 8. 메모리 매핑 파일(Memory Mapped File)을 이용한 초고속 프로세스 간 데이터 공유 메모리 매핑 파일(Memory Mapped File)을 이용한 초고속 프로세스 간 데이터 공유두 개 이상의 독립된 프로세스가 데이터를 주고받을 때, TCP/IP나 WM_COPYDATA보다 훨씬 빠른 방법이 바로 공유 메모리(Shared Memory)**입니다. 윈도우의 '메모리 매핑 파일' 기술을 활용하면 특정 메모리 영역을 시스템 파일(또는 페이징 파일)에 매핑하고, 여러 프로그램이 이 구역을 자신의 주소 공간처럼 접근할 수 있습니다. 이는 물리적인 복사 과정 없이 메모리 주소에 직접 쓰고 읽기 때문에 대용량 데이터를 실시간으로 공유해야 하는 솔루션(예: 영상 처리 결과 전달, 주식 데이터 공유 등)에 최적입니다. unit SharedMemoryUnit; interface uses .. 2026. 4. 7. 델파이 문자열 타입의 종류와 메모리 구조 이해 델파이 문자열 타입의 종류와 메모리 구조 이해 델파이에서 가장 흔히 사용하는 string 타입은 기본적으로 UnicodeString입니다. 하지만 과거 버전과의 호환성이나 통신용 바이너리 처리를 위해 AnsiString, RawByteString, UTF8String 등 다양한 타입을 제공합니다. 특히 현대의 string은 참조 카운팅(Reference Counting)과 Copy-on-Write 메커니즘을 사용하여 메모리를 효율적으로 관리합니다. 예제 코드 program StringTypeExample; {$APPTYPE CONSOLE} uses System.SysUtils; var UStr: string; // 기본 UnicodeString (2바이트 문자) ASt.. 2026. 4. 2. VCL 클립보드를 활용한 다중 형식(텍스트/이미지) 데이터 복사 및 붙여넣기 VCL 클립보드를 활용한 다중 형식(텍스트/이미지) 데이터 복사 및 붙여넣기 델파이의 Vcl.Clipbrd 유닛은 윈도우 클립보드를 객체지향적으로 다룰 수 있는 Clipboard 전역 객체를 제공합니다. 이를 통해 단순히 문자열을 복사하는 것을 넘어, 비트맵 이미지를 복사하거나 현재 클립보드에 담긴 데이터가 어떤 형식인지(HasFormat) 확인하여 조건에 맞게 가져올 수 있습니다. 사용자가 Ctrl+V를 눌렀을 때 텍스트인지 이미지인지 판별하여 적절한 컨트롤에 뿌려주는 로직을 구현할 때 필수적입니다. uses Vcl.Clipbrd, Vcl.Graphics, System.SysUtils; { 1. 클립보드에 텍스트와 이미지 복사하기 } procedure TForm1.CopyDataToCli.. 2026. 4. 1. 커스텀 Attribute와 RTTI를 이용한 선언적 유효성 검사 커스텀 Attribute와 RTTI를 이용한 선언적 유효성 검사 델파이의 Attribute(특성)**는 코드 요소(클래스, 속성, 메소드 등)에 메타데이터를 추가하는 기능입니다. 이를 RTTI(Runtime Type Information)와 결합하면, 로직 파일에 직접 if..then을 도배하지 않고도 속성에 붙은 특성만 읽어와서 자동으로 유효성을 검사하거나 UI를 생성하는 등의 선언적 프로그래밍(Declarative Programming)이 가능해집니다. program AttributeValidationExample; {$APPTYPE CONSOLE} uses System.SysUtils, System.Rtti; type // 1. 유효성 검사용 커스텀 Attribute 정의 TRa.. 2026. 3. 31. Sender 파라미터와 'is', 'as' 연산자를 이용한 이벤트 핸들러 공유 Sender 파라미터와 'is', 'as' 연산자를 이용한 이벤트 핸들러 공유델파이에서 버튼 클릭과 같은 이벤트가 발생할 때 호출되는 메소드에는 항상 Sender: TObject라는 파라미터가 전달됩니다. 이 Sender는 이벤트를 발생시킨 실제 컴포넌트를 가리킵니다. 이를 활용하면 여러 개의 버튼이 하나의 클릭 이벤트 핸들러를 공유하도록 만들 수 있으며, is 연산자로 타입을 확인하고 as 연산자나 타입 캐스팅으로 해당 컴포넌트의 속성을 제어할 수 있습니다. unit Unit1; interface uses System.SysUtils, System.Classes, Vcl.Forms, Vcl.StdCtrls, Vcl.Controls; type TForm1 = class(TForm) .. 2026. 3. 27. ISO 8601 문자열을 안전하게 날짜로 변환하기 ISO 8601 문자열을 안전하게 날짜로 변환하기 REST API, 로그 파일, 외부 시스템 연동 데이터를 다루다 보면 2026-03-25T08:30:45 같은 ISO 8601 형식의 날짜 문자열을 자주 받게 됩니다. 이때 단순히 StrToDateTime만 사용하면 PC의 지역 설정에 따라 파싱이 실패하거나 잘못 해석될 수 있습니다. 델파이에서는 ISO8601ToDate를 사용하면 국제 표준 형식의 날짜 문자열을 비교적 안전하게 TDateTime으로 변환할 수 있습니다. 특히 서버 연동, DB 저장 전 검증, 로그 분석 기능에서 매우 유용합니다. program ISO8601DateParseDemo; {$APPTYPE CONSOLE} uses System.SysUtils, Syste.. 2026. 3. 26. 클래스 참조(Class Reference)와 가상 생성자를 이용한 동적 객체 생성 클래스 참조(Class Reference)와 가상 생성자를 이용한 동적 객체 생성델파이의 강력한 특징 중 하나는 클래스 자체를 변수에 저장할 수 있는 클래스 참조(Class Reference) 타입입니다. class of TObject 형태의 타입을 정의하면, 런타임에 어떤 클래스를 생성할지 결정할 수 있습니다. 이때 부모 클래스에서 생성자를 virtual로 선언하면, 실제 저장된 하위 클래스의 생성자가 호출되어 다형성을 디자인 타임이 아닌 실행 시점에 완벽하게 구현할 수 있습니다. program ClassReferenceExample; {$APPTYPE CONSOLE} uses System.SysUtils; type // 1. 베이스 클래스 정의 TBaseMessage = clas.. 2026. 3. 25. High DPI 환경을 위한 가상 이미지 리스트(TVirtualImageList) 활용 High DPI 환경을 위한 가상 이미지 리스트(TVirtualImageList) 활용 4K 이상의 고해상도 모니터가 보편화되면서, 96 DPI(100%) 기준으로 제작된 작은 아이콘들이 고배율(150%, 200% 등) 환경에서 흐릿하게 깨져 보이는 문제가 발생합니다. 최신 델파이 VCL에서는 이를 해결하기 위해 **TImageCollection**과 **TVirtualImageList**를 제공합니다. 원본 고해상도 이미지들을 컬렉션에 보관하고, 가상 이미지 리스트가 현재 모니터의 DPI 배율에 맞춰 실시간으로 최적의 크기로 렌더링하여 이미지를 공급하는 방식입니다. 예제 코드 // 소스 코드 상에서 DPI 변경에 대응하는 로직 예시 // (대부분 디자인 타임 설정만으로 동작하지만, 동적 제.. 2026. 3. 13. TScreen 객체와 TRect를 활용한 다중 모니터 폼 이탈 방지 TScreen 객체와 TRect를 활용한 다중 모니터 폼 이탈 방지 다중 모니터 환경에서는 보조 모니터에서 프로그램을 종료한 뒤 해당 모니터 연결을 해제하면, 다음 실행 시 메인 화면 밖(허공)에 폼이 생성되어 사용자가 당황하는 경우가 발생합니다. 이때 전역 객체인 **TScreen**과 최신 델파이의 TRect.IntersectsWith 메서드를 조합하면, 폼이 현재 활성화된 모니터 영역 내에 존재하는지 빠르고 직관적으로 판단하여 안전한 위치로 폼을 강제 소환할 수 있습니다. uses Vcl.Forms, System.Types, Vcl.Controls; // TRect 처리를 위해 System.Types 필요 procedure EnsureFormIsVisible(AForm: TForm);.. 2026. 3. 12. 강제 참조 카운팅 제어를 통한 인터페이스 성능 최적 강제 참조 카운팅 제어를 통한 인터페이스 성능 최적델파이의 인터페이스는 IUnknown의 ARC(Automatic Reference Counting) 메커니즘을 따릅니다. 하지만 고성능 루프 내에서 수만 번의 인터페이스 할당이 일어날 경우, 원자적 연산인 _AddRef와 _Release의 호출은 상당한 오버헤드가 됩니다. 인터페이스 캐스팅 무효화 또는 상속받은 _AddRef/_Release 오버라이드를 통해 참조 카운팅을 생략함으로써 네이티브 객체에 가까운 성능을 끌어낼 수 있습니다. program InterfaceOptimizingExample; {$APPTYPE CONSOLE} uses System.SysUtils; type // 1. 참조 카운팅을 수행하지 않는 커스텀 객체 정의 .. 2026. 3. 11. 커스텀 열거자(Custom Enumerator) 구현을 통한 For-In 루프 최적화 커스텀 열거자(Custom Enumerator) 구현을 통한 For-In 루프 최적화델파이의 for..in 루프는 기본적으로 배열이나 TList 같은 표준 컬렉션에서 작동합니다. 하지만 직접 만든 복잡한 자료구조나 특정 조건에 맞는 데이터만 순회하고 싶을 때 GetEnumerator 함수를 클래스에 구현하면, 표준 컬렉션이 아니더라도 for..in 문법을 사용할 수 있습니다. 이를 통해 내부 구현을 감추면서도 사용자에게는 매우 직관적인 순회 인터페이스를 제공할 수 있습니다. program CustomEnumeratorExample; {$APPTYPE CONSOLE} uses System.SysUtils; type // 홀수만 순회하는 커스텀 열거자 클래스 TOddEnumerator .. 2026. 3. 4. FDQuery의 Array DML을 활용한 대량 Insert 성능 극대화 FDQuery의 Array DML을 활용한 대량 Insert 성능 극대화수천, 수만 건의 데이터를 DB에 삽입할 때 루프를 돌며 ExecSQL을 반복 호출하면 네트워크 왕복(Round-trip)과 구문 분석 오버헤드로 인해 속도가 매우 느려집니다. FireDAC의 Array DML 기능을 사용하면 여러 레코드의 파라미터 값을 배열에 담아 단 한 번의 호출로 서버에 전송할 수 있습니다. 이는 일반적인 루프 방식보다 수십 배 이상의 성능 향상을 제공합니다. uses System.SysUtils, FireDAC.Comp.Client; procedure BulkInsertExample(AFDQuery: TFDQuery); var I: Integer; const BATCH_COUNT = 1.. 2026. 2. 26. Free vs Release vs DisposeOf 객체 해제 메서드의 실제 차이와 안전한 사용 기준 Free vs Release vs DisposeOf 객체 해제 메서드의 실제 차이와 안전한 사용 기준 Delphi에서 객체를 해제할 때 흔히 사용하는 방법은 여러 가지입니다. Free Release DisposeOf 겉보기에는 비슷하지만 실제 동작과 사용 목적이 다릅니다. 이 차이를 모르면 UI 이벤트 중 크래시,메시지 루프 중 접근 위반, 모바일 ARC 환경 호환 문제 같은 실무 사고가 발생합니다. 예제 코드 program ObjectFreeReleaseDisposeDemo; {$APPTYPE CONSOLE} uses System.SysUtils; type TMyObject = class public constructor Create; destructor Destroy; o.. 2026. 2. 25. Class Helper의 동작 원리와 숨겨진 위험성 Class Helper의 동작 원리와 숨겨진 위험성 Delphi의 class helper는 기존 클래스를 수정하지 않고 메서드를 “추가한 것처럼” 보이게 만드는 기능입니다. type TObjectHelper = class helper for TObject function ClassNameUpper: string; end; 겉으로 보면 확장 메서드처럼 보이지만, 실제 동작은 전혀 다릅니다. Class Helper는 런타임 확장이 아니다. **컴파일 시점에만 적용되는 문법적 확장(컴파일러 트릭)**이다. program ClassHelperMechanismDemo; {$APPTYPE CONSOLE} uses System.SysUtils; type // 1️⃣ 기존 TObject에 기능 .. 2026. 2. 13. 열거형(Enumerated Types)을 활용한 코드 가독성 향상 열거형(Enumerated Types)을 활용한 코드 가독성 향상코드에서 상태나 종류를 나타낼 때 0, 1, 2와 같은 숫자(Magic Number)를 사용하면 나중에 코드를 볼 때 의미를 파악하기 어렵습니다. **열거형(Enumerated Types)**은 관련된 상수들의 집합에 이름을 부여하여 코드를 훨씬 읽기 쉽게 만들어 줍니다. 델파이의 열거형은 타입 체크가 엄격하여 엉뚱한 값이 들어가는 것을 방지해주며, Case 문과 결합했을 때 매우 강력한 위력을 발휘합니다. program EnumExample; {$APPTYPE CONSOLE} uses System.SysUtils; type // 열거형 정의: 관례적으로 이름 앞에 'T'를, 각 항목 앞에 약어(ts)를 붙입니다. T.. 2026. 2. 12. final 메서드가 실제로 성능과 설계에 미치는 영향 final 메서드가 실제로 성능과 설계에 미치는 영향Delphi에서 메서드 선언 끝에 붙일 수 있는 키워드가 있습니다. procedure DoWork; virtual; final; final은 단순히 “오버라이드 금지” 정도로 알려져 있지만, 실제로는 설계 안정성 + 컴파일러 최적화 가능성이라는 두 가지 중요한 의미를 가집니다. final = 이 메서드는 여기서 설계가 끝났다 → 더 이상 재정의되지 않음을 컴파일러와 개발자 모두에게 보장 예제 코드 program FinalMethodDemo; {$APPTYPE CONSOLE} uses System.SysUtils, System.Diagnostics; type TBase = class public procedure VirtualWor.. 2026. 2. 11. virtual / dynamic / override — 실제 차이와 성능·설계 영향 virtual / dynamic / override — 실제 차이와 성능·설계 영향 Delphi의 객체지향을 제대로 쓰다 보면 반드시 마주치는 키워드 3종 세트가 있습니다. virtual → 가상 메서드 dynamic → 옛날 거 / 잘 안 씀 override → 재정의 하지만 왜 dynamic이 존재하는지, 성능·메모리·설계 관점에서의 차이를 정확히 아는 경우는 드뭅니다. virtual = VMT 기반, 빠름, 메모리 고정 dynamic = 메시지 ID 기반, 느림, 메모리 절약 예제 코드 program VirtualDynamicDemo; {$APPTYPE CONSOLE} uses System.SysUtils, System.Diagnostics; type TBase = class pub.. 2026. 2. 10. inherited 호출 순서가 실제로 미치는 영향과 흔한 실수 inherited 호출 순서가 실제로 미치는 영향과 흔한 실수Delphi에서 메서드를 재정의(override)할 때 거의 항상 등장하는 키워드이며, inherited는 “부모 구현을 언제 실행할지”를 명시적으로 결정하는 제어문이다 program InheritedOrderDemo; {$APPTYPE CONSOLE} uses System.SysUtils; type TBase = class public constructor Create; virtual; destructor Destroy; override; procedure DoWork; virtual; end; TChild = class(TBase) public constructor Create; overri.. 2026. 2. 9. 이전 1 2 3 4 ··· 32 다음