본문 바로가기

Delphi186

Delphi에서 제네릭 리스트(TList<T>) 효율적으로 사용하기 (Intermediate) Delphi에서 제네릭 리스트(TList) 효율적으로 사용하기 (Intermediate) 델파이(Delphi)에서 TList는 제네릭을 지원하는 강력한 리스트 컬렉션으로, 타입 안정성과 성능을 모두 제공합니다. 기존의 TList는 Pointer 기반이라 형변환이 필요했지만, TList는 컴파일 타임에 타입이 고정되어 안전합니다. 또한 for..in 구문과 함께 사용하면 더 직관적인 코드 작성이 가능합니다. uses System.Generics.Collections, System.SysUtils; procedure TestGenericList; var Numbers: TList; I: Integer; begin Numbers := TList.Create; try // 값 추가.. 2025. 8. 13.
익명 메서드로 코드 가독성 향상하기 익명 메서드로 코드 가독성 향상하기 익명 메서드는 로컬 변수처럼 선언되어 특정 코드 블록 내에서만 사용 가능한 메서드입니다. 주로 콜백 함수, 정렬, 스레딩, 이벤트 핸들링 등에서 유용하며 코드 가독성을 높이고 메서드 분리를 최소화할 수 있습니다. procedure TForm1.Button1Click(Sender: TObject); var Multiply: reference to function(A, B: Integer): Integer; Result: Integer; begin Multiply := function(A, B: Integer): Integer begin Result := A * B; end; Result := Multiply(6, 7); S.. 2025. 8. 6.
TStringHelper를 이용한 문자열 분할과 트리밍 TStringHelper를 이용한 문자열 분할과 트리밍 델파이의 TStringHelper는 string 타입에 유용한 메서드를 확장해주는 기능입니다. 특히 Split, Trim, ToUpper 등은 문자열 처리에서 자주 사용되며 가독성도 크게 향상됩니다. uses System.SysUtils, System.Classes; procedure ParseUserInput(const Input: string); var Parts: TArray; Name, Email: string; begin Parts := Input.Split([',']); // 콤마 기준으로 분할 if Length(Parts) >= 2 then begin Name := Parts[0].Trim; Emai.. 2025. 8. 4.
레코드를 객체처럼 다루기: 메서드 포함 레코드 레코드를 객체처럼 다루기: 메서드 포함 레코드 델파이의 record는 단순한 데이터 저장용으로 쓰이지만, 메서드나 생성자도 정의할 수 있어 객체처럼 활용할 수 있습니다. 이 기법은 간단한 구조 데이터에 기능을 부여하고자 할 때 유용합니다. type TEmployee = record Name: string; Salary: Currency; procedure RaiseSalary(Amount: Currency); function GetInfo: string; end; procedure TEmployee.RaiseSalary(Amount: Currency); begin Salary := Salary + Amount; end; function TEmployee.GetI.. 2025. 8. 1.
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.