본문 바로가기

Delphi182

TTask를 이용한 백그라운드 작업 처리 TTask를 이용한 백그라운드 작업 처리 Systehttp://m.Threading.TTask를 활용하면 UI를 멈추지 않고 백그라운드에서 작업을 처리할 수 있습니다. 예를 들어, 긴 로직이나 서버 통신을 처리할 때 UI 응답성을 유지하면서 동시에 병렬 처리를 구현할 수 있습니다. uses System.Threading, System.SysUtils, Vcl.Dialogs; procedure DoBackgroundWork; begin TTask.Run( procedure begin Sleep(3000); // 3초 동안 작업 수행 TThread.Synchronize(nil, procedure begin Show.. 2025. 7. 31.
TObjectList로 객체 메모리 자동 관리하기 TObjectList로 객체 메모리 자동 관리하기 델파이에서 객체 리스트를 다룰 때 수동으로 메모리를 해제하는 번거로움을 줄이기 위해 TObjectList를 사용하면 객체 소유권을 리스트가 가지게 되어 자동으로 메모리를 해제할 수 있습니다. uses System.Generics.Collections, System.SysUtils; type TCustomer = class Name: string; constructor Create(const AName: string); end; constructor TCustomer.Create(const AName: string); begin Name := AName; end; procedure TForm1.Button1Click(Send.. 2025. 7. 25.
Parallel.For로 손쉬운 병렬 반복 처리하기 (Advanced) Parallel.For로 손쉬운 병렬 반복 처리하기 (Advanced) 델파이에서는 TParallel.For(System.Threading) 기능을 이용해 반복 작업을 병렬로 처리할 수 있습니다. 다중 코어 CPU를 활용해 속도를 높이고, 코드도 단순화할 수 있어 이미지 처리, 데이터 변환, 대용량 연산 등에 매우 유용합니다. uses System.SysUtils, System.Threading; procedure ProcessItems; const N = 1000; var Arr: TArray; begin SetLength(Arr, N); TParallel.For(0, N - 1, procedure (Index: Integer) begin // 예: 각 .. 2025. 7. 18.
TObjectList<T>를 활용한 안전한 객체 리스트 관리 TObjectList를 활용한 안전한 객체 리스트 관리 Delphi에서는 객체 리스트를 관리할 때 TObjectList를 사용하면 메모리 관리를 자동으로 처리할 수 있어 매우 유용합니다. OwnsObjects 속성이 True로 설정되면 리스트에서 객체를 제거하거나 리스트를 해제할 때 해당 객체들도 자동으로 해제됩니다. TObjectList는 제너릭 리스트 클래스이며, 객체의 소유권을 갖고 있어, 직접 Free하지 않아도 됩니다. 이를 통해 메모리 누수를 방지할 수 있습니다. uses System.Generics.Collections, System.SysUtils; type TPerson = class Name: string; constructor Create(const A.. 2025. 7. 9.
레코드(Record)에서 메서드 활용하기 레코드(Record)에서 메서드 활용하기 Delphi의 Record는 단순 데이터 저장 구조로 알려져 있지만, 메서드와 연산자 오버로드도 지원합니다. 이를 활용하면 클래스보다 가볍지만 구조화된 동작을 구현할 수 있어 성능과 구조를 모두 챙길 수 있습니다. type TPointRec = record X, Y: Integer; procedure Offset(DX, DY: Integer); function ToString: string; end; procedure TPointRec.Offset(DX, DY: Integer); begin Inc(X, DX); Inc(Y, DY); end; function TPointRec.ToString: string; begin R.. 2025. 7. 4.
TList<T> 제네릭 리스트 사용법 TList 제네릭 리스트 사용법TList는 Delphi에서 제네릭 타입을 사용해 타입 안정성을 보장하는 리스트입니다. 고정된 타입의 데이터를 리스트에 담고 처리할 수 있어 컴파일 타임에 타입 체크가 가능하며, 코드의 안정성과 가독성을 높일 수 있습니다. uses System.Generics.Collections, System.SysUtils; procedure TestGenericList; var Numbers: TList; I: Integer; begin Numbers := TList.Create; try Numbers.Add(10); Numbers.Add(20); Numbers.Add(30); for I in Numbers do Writ.. 2025. 6. 30.
TTask를 활용한 비동기 처리 TTask를 활용한 비동기 처리 TTask는 System.Threading 유닛에서 제공되며, Delphi에서 멀티스레딩을 간편하게 처리할 수 있는 클래스입니다. 긴 작업을 백그라운드에서 실행하고, 메인 스레드(UI)를 블로킹하지 않도록 할 수 있어 프로그램의 반응성이 향상됩니다. uses System.Threading, System.SysUtils, Vcl.Dialogs; procedure RunAsyncTask; begin TTask.Run( procedure begin Sleep(3000); // 3초간 대기 (긴 작업 시뮬레이션) TThread.Synchronize(nil, procedure begin .. 2025. 6. 27.
Interface를 이용한 유연한 코드 설계 Interface를 이용한 유연한 코드 설계 Delphi에서 Interface는 객체 간의 결합도를 낮추고 코드 재사용성과 확장성을 높이기 위해 매우 유용한 구조입니다. 특히 큰 프로젝트에서 모듈 간의 독립성을 유지하며 기능을 구현할 수 있도록 도와줍니다. type IGreeter = interface ['{B9C1E68F-8B3F-43F7-B8E7-CF234DE6E3AD}'] procedure Greet; end; TEnglishGreeter = class(TInterfacedObject, IGreeter) public procedure Greet; end; TKoreanGreeter = class(TInterfacedObject, IGreeter) .. 2025. 6. 26.
IncludeTrailingPathDelimiter로 경로 끝 관리하기 IncludeTrailingPathDelimiter로 경로 끝 관리하기 파일 경로나 폴더를 조합할 때 슬래시(\) 누락으로 인해 경로가 잘못 처리되는 경우가 많습니다. IncludeTrailingPathDelimiter 함수는 경로 문자열 끝에 구분자가 없으면 자동으로 추가해 주므로, 경로 연결 시 안전하게 사용할 수 있습니다. uses System.SysUtils; procedure BuildFilePath; var BaseDir, FileName, FullPath: string; begin BaseDir := 'C:\MyApp\Data'; FileName := 'report.txt'; // 구분자가 없으면 '\'를 추가 FullPath := IncludeTrailing.. 2025. 6. 25.
Exit으로 코드 흐름을 깔끔하게 정리하기 Exit으로 코드 흐름을 깔끔하게 정리하기델파이에서 조건 분기나 예외 처리를 효율적으로 제어하고 싶을 때 Exit 명령을 활용하면 코드 가독성이 높아집니다. 불필요한 중첩을 피하고 빠르게 함수 종료를 유도할 수 있습니다. function IsPositive(Value: Integer): Boolean; begin if Value Exit(False); // 이후 코드: Value > 0인 경우만 실행 Result := True; end; procedure Test; begin ShowMessage(BoolToStr(IsPositive(5), True)); // 출력: TRUE ShowMessage(BoolToStr(IsPositive(-2), True)); //.. 2025. 6. 24.
익명 메서드(Anonymous Method)로 유연한 이벤트 처리 구현하기 익명 메서드(Anonymous Method)로 유연한 이벤트 처리 구현하기 Delphi에서는 익명 메서드를 사용해 이벤트 처리나 콜백 기능을 보다 간결하게 작성할 수 있습니다. 특히 VCL에서는 TThread, TTask, TTimer 등에서 익명 메서드를 많이 활용합니다. uses System.SysUtils, System.Classes, Vcl.ExtCtrls; procedure UseAnonymousMethod; var Timer: TTimer; begin Timer := TTimer.Create(nil); Timer.Interval := 1000; Timer.OnTimer := procedure(Sender: TObject) begin ShowMessage('1초.. 2025. 6. 23.
in 연산자를 사용한 가독성 높은 조건 비교 in 연산자를 사용한 가독성 높은 조건 비교Delphi에서는 특정 값이 여러 값 중 하나인지 확인할 때 in 연산자를 사용하면 코드가 훨씬 간결하고 가독성이 높아집니다. 특히 조건이 많아질수록 or를 나열하는 방식보다 in을 사용하는 것이 훨씬 효율적입니다. procedure CheckFruit(const AName: string); begin if AName in ['Apple', 'Banana', 'Orange'] then ShowMessage(AName + ' is a fruit!') else ShowMessage(AName + ' is not a known fruit.'); end; // 호출 예시 CheckFruit('Apple'); // 결과: Apple is a.. 2025. 6. 20.
메모리 누수를 방지하는 try..finally 패턴의 활용 메모리 누수를 방지하는 try..finally 패턴의 활용 Delphi에서 객체를 동적으로 생성할 때, 예외가 발생해도 메모리를 안전하게 해제할 수 있도록 try..finally 패턴을 사용하는 것이 매우 중요합니다. 이 구조는 시스템 안정성을 크게 높이며, 모든 개발자가 반드시 습관화해야 할 필수 패턴입니다. procedure SafeObjectUsage; var SL: TStringList; begin SL := TStringList.Create; try SL.Add('델파이'); SL.Add('코딩'); ShowMessage(SL.Text); finally SL.Free; end; end; try..finally는 리소스를 안전하게 해제할 수 있.. 2025. 6. 19.
TClientDataSet의 SaveToFile과 LoadFromFile로 로컬 데이터 저장 및 복원 TClientDataSet의 SaveToFile과 LoadFromFile로 로컬 데이터 저장 및 복원 TClientDataSet은 파일 기반으로 데이터를 저장하고 복원할 수 있는 강력한 기능을 제공합니다. 이를 통해 데이터베이스 연결 없이도 데이터를 저장하거나 테스트용 데이터를 불러오는 작업이 가능합니다. uses Datasnap.DBClient; procedure SaveAndLoadClientDataSet; var CDS: TClientDataSet; begin CDS := TClientDataSet.Create(nil); try CDS.FieldDefs.Add('Name', ftString, 50); CDS.CreateDataSet; CDS.AppendRe.. 2025. 6. 17.
TStringList의 Duplicates 속성을 활용한 중복 제거 TStringList의 Duplicates 속성을 활용한 중복 제거 TStringList는 문자열 목록을 다룰 때 매우 유용한 클래스입니다. 특히 Sorted 속성과 Duplicates 속성을 함께 사용하면 중복 데이터를 손쉽게 제거할 수 있습니다. 데이터 정리, 중복 검출 등의 작업에 유용합니다. procedure RemoveDuplicates; var SL: TStringList; begin SL := TStringList.Create; try SL.Sorted := True; SL.Duplicates := dupIgnore; SL.Add('Apple'); SL.Add('Banana'); SL.Add('Apple'); SL.Add('Orang.. 2025. 6. 16.
TStopwatch로 코드 실행 시간 측정하기 TStopwatch로 코드 실행 시간 측정하기 성능 분석이나 최적화가 필요한 경우, 델파이의 System.Diagnostics.TStopwatch를 사용하면 코드 블록의 실행 시간을 정밀하게 측정할 수 있습니다. 간단하게 시작, 정지, 경과 시간 확인이 가능하여 유닛 테스트나 성능 튜닝에 매우 유용합니다. uses System.Diagnostics, System.SysUtils; procedure MeasureExecutionTime; var Stopwatch: TStopwatch; I: Integer; begin Stopwatch := TStopwatch.StartNew; // 실행 시간 측정 대상 코드 for I := 1 to 1000000 do Dummy := .. 2025. 6. 12.
Record Helper로 레코드에 메서드 추가하기 Record Helper로 레코드에 메서드 추가하기 델파이의 Record Helper 기능을 활용하면 기존 레코드 타입에 메서드를 확장할 수 있습니다. 이를 통해 데이터 중심 구조에 객체지향적인 동작을 부여할 수 있어 코드 재사용성과 가독성이 향상됩니다. type TPoint = record X, Y: Integer; end; TPointHelper = record helper for TPoint function ToString: string; procedure Offset(DX, DY: Integer); end; function TPointHelper.ToString: string; begin Result := Format('(%d, %d)', [X, Y]).. 2025. 6. 11.
TStringList로 키-값 쌍 관리하기 TStringList로 키-값 쌍 관리하기 TStringList는 문자열 배열처럼 작동하지만, Name=Value 형식으로 데이터를 저장하면 간단한 설정 값이나 메모리 내 임시 Key-Value 저장소로도 활용 가능합니다. 내부적으로 정렬 및 검색 기능도 지원되며, INI 형식과 유사하게 동작합니다. procedure UseStringListAsDictionary; var SL: TStringList; begin SL := TStringList.Create; try SL.Values['Server'] := 'localhost'; SL.Values['Port'] := '3306'; SL.Values['User'] := 'admin'; ShowMessage('접.. 2025. 6. 5.
인터페이스(Interface) 활용으로 메모리 자동 관리 구현하기 인터페이스(Interface) 활용으로 메모리 자동 관리 구현하기 델파이에서 인터페이스를 활용하면 참조 카운트를 기반으로 객체의 생명주기를 자동으로 관리할 수 있습니다. 이를 통해 try..finally 없이도 안전하게 객체를 해제할 수 있어 메모리 누수 방지와 코드 간결성에서 매우 유용합니다. type IMyWorker = interface ['{A1B2C3D4-E5F6-1234-5678-90ABCDEF1234}'] procedure DoWork; end; TMyWorker = class(TInterfacedObject, IMyWorker) public procedure DoWork; end; procedure TMyWorker.DoWork; begin .. 2025. 6. 4.
SetLength로 동적 배열 크기 안전하게 조절하기 SetLength로 동적 배열 크기 안전하게 조절하기 델파이에서 동적 배열은 고정 크기의 정적 배열과 달리 런타임에 크기를 자유롭게 바꿀 수 있습니다. 이때 SetLength 함수를 사용하면 요소 수를 설정하거나 확장할 수 있습니다. 배열 크기를 변경할 때 기존 데이터가 유지되므로 반복적 추가나 삭제 시 유용합니다. procedure ManageDynamicArray; var Numbers: array of Integer; I: Integer; begin SetLength(Numbers, 3); Numbers[0] := 10; Numbers[1] := 20; Numbers[2] := 30; SetLength(Numbers, 5); // 배열 확장 Numbers[3] :.. 2025. 6. 3.