본문 바로가기

delphi562

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.
FireDAC에서 매개변수화 쿼리로 SQL 인젝션 방지하기 (Intermediate) FireDAC에서 매개변수화 쿼리로 SQL 인젝션 방지하기 (Intermediate) Delphi에서 데이터베이스 쿼리를 실행할 때, 문자열을 직접 연결하면 SQL 인젝션 공격에 취약해질 수 있습니다. FireDAC의 TFDQuery 컴포넌트를 사용하면 매개변수화(Parameterized) 쿼리를 적용하여 보안성과 성능을 모두 향상시킬 수 있습니다. 매개변수는 :파라미터명 형식으로 선언하며, ParamByName 메서드로 값을 지정합니다. uses FireDAC.Comp.Client; procedure TForm1.btnSearchClick(Sender: TObject); begin FDQuery1.SQL.Text := 'SELECT * FROM Customers WHERE Name = :N.. 2025. 8. 12.
TPath.GetTempFileName + TFile로 안전한 임시 파일 사용하기 TPath.GetTempFileName + TFile로 안전한 임시 파일 사용하기임시 데이터를 다룰 때는 OS가 보장하는 임시 폴더와 충돌 없는 파일명을 쓰는 게 안전합니다. System.IOUtils의 TPath.GetTempPath, TPath.GetTempFileName과 TFile.WriteAllText/ReadAllText/Delete를 조합하면, 경로/이름 충돌 걱정 없이 생성→사용→정리까지 한 번에 처리할 수 있습니다. uses System.SysUtils, System.IOUtils; procedure UseTempFile; var TempDir, TempFile, Data, ReadBack: string; begin TempDir := TPath.GetTempPath;.. 2025. 8. 11.
TStringBuilder로 효율적인 문자열 결합하기 TStringBuilder로 효율적인 문자열 결합하기 Delphi에서 반복문이나 대량 문자열 조합 시 + 연산자를 사용하면 메모리 재할당이 빈번해 성능 저하가 발생할 수 있습니다. TStringBuilder는 내부 버퍼를 관리해 한 번만 메모리를 할당하고 문자열을 누적하므로, 대용량 텍스트 생성에 탁월합니다. uses System.SysUtils, System.Classes; procedure BuildLargeString; var SB: TStringBuilder; I: Integer; ResultStr: string; begin SB := TStringBuilder.Create; try for I := 1 to 10000 do SB.AppendFormat.. 2025. 8. 8.
TStreamReader로 인코딩된 텍스트 파일 읽기 (Beginner) TStreamReader로 인코딩된 텍스트 파일 읽기 (Beginner) 델파이에서 다양한 인코딩(UTF-8, ANSI 등)의 텍스트 파일을 읽을 때는 TStreamReader를 사용하면 간편합니다. TStreamReader 생성자에 인코딩을 지정해주면, 올바른 문자 변환이 자동으로 이뤄져 파일 내용이 깨지지 않습니다.​uses System.Classes, System.SysUtils;​procedure ReadTextFile(const FileName: string);var Reader: TStreamReader; Line: string;begin // UTF-8 인코딩으로 읽기 Reader := TStreamReader.Create(FileName, TEncoding.UTF8); try while n.. 2025. 8. 5.
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.
TPath.ChangeExtension으로 파일 확장자 쉽게 변경하기 TPath.ChangeExtension으로 파일 확장자 쉽게 변경하기 파일의 확장자만 바꿔야 할 때, 문자열 조작 없이 TPath.ChangeExtension 함수를 사용하면 간편하고 안전하게 처리할 수 있습니다. 작업 파일 자동 이름 변경, 백업 파일 생성, 로그 리네이밍 등에 유용합니다. uses System.SysUtils, System.IOUtils; procedure ChangeFileExtDemo; var OldName, NewName: string; begin OldName := 'C:\Temp\report.txt'; NewName := TPath.ChangeExtension(OldName, '.bak'); ShowMessage('변경된 파일명: ' + NewName);.. 2025. 7. 21.
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.
TPath.Combine로 경로 연결 오류 없이 처리하기 TPath.Combine로 경로 연결 오류 없이 처리하기 폴더와 파일 경로를 연결할 때 IncludeTrailingPathDelimiter와 단순 문자열 덧셈으로 처리하다 보면 경로 중복(\)이나 누락 문제가 자주 발생합니다. TPath.Combine 함수는 이를 자동으로 처리해줘 경로 조합을 안전하고 간결하게 합니다. uses System.SysUtils, System.IOUtils; procedure ShowCombinedPath; var BaseDir, FileName, FullPath: string; begin BaseDir := 'C:\MyApp\Data'; // 또는 'C:\MyApp\Data\' FileName := 'report.txt'; FullP.. 2025. 7. 17.
TMemoryStream 사용으로 메모리 기반 데이터 처리하기 TMemoryStream 사용으로 메모리 기반 데이터 처리하기 파일 입출력이나 네트워크 메시지를 메모리에서 처리할 때, TMemoryStream을 활용하면 데이터의 읽기·쓰기 작업을 파일 디스크 없이 빠르게 수행할 수 있어 테스트, 임시 데이터 처리, 버퍼링 등에 유용합니다. uses System.Classes, System.SysUtils; procedure TestMemoryStream; var MS: TMemoryStream; Msg: string; begin MS := TMemoryStream.Create; try Msg := '델파이 메모리 스트림!'; MS.WriteBuffer(Pointer(Msg)^, Length(Msg)); MS.Position.. 2025. 7. 16.
레코드를 JSON 문자열로 쉽게 변환하기 (Advanced) 레코드를 JSON 문자열로 쉽게 변환하기 (Advanced)Delphi에서는 System.JSON과 System.Rtti를 활용하면 레코드(Record)를 손쉽게 JSON 문자열로 변환할 수 있습니다. 이 기능은 REST API 개발이나 데이터 직렬화에서 매우 유용합니다. uses System.SysUtils, System.Rtti, System.JSON, System.TypInfo; type TPerson = record Name: string; Age: Integer; end; function RecordToJSON(const ARecord: T): string; var ctx: TRttiContext; rType: TRttiType; rField: TRttiF.. 2025. 7. 14.
레코드를 JSON 문자열로 쉽게 변환하기 (Advanced) 레코드를 JSON 문자열로 쉽게 변환하기 (Advanced)델파이에서는 TJSON 관련 유닛을 활용하면 레코드(Record)를 간편하게 JSON 문자열로 변환할 수 있습니다. 이 기능은 REST API 개발이나 데이터 직렬화가 필요한 경우 유용하게 사용됩니다. TJson.JsonToObject 또는 TJson.ObjectToJsonString를 이용하면 객체나 레코드를 JSON 문자열로 직렬화하거나 역직렬화할 수 있습니다. 단, RTTI를 기반으로 동작하므로 System.Rtti, System.JSON, Rest.Json 유닛이 필요합니다. uses System.SysUtils, System.JSON, REST.Json; type TPerson = record Name: stri.. 2025. 7. 11.
TryStrToDate로 문자열 → 날짜 안전하게 변환하기 TryStrToDate로 문자열 → 날짜 안전하게 변환하기 델파이에서 사용자가 입력한 문자열을 날짜로 변환할 때 StrToDate를 쓰면 형식이 맞지 않으면 예외가 발생합니다. 이럴 경우 프로그램이 중단될 수 있어 위험합니다. TryStrToDate를 사용하면 예외 없이 변환 여부를 체크할 수 있어 유효성 검사에 매우 유용합니다. uses System.SysUtils; procedure ShowValidDate(const S: string); var D: TDate; begin if TryStrToDate(S, D) then ShowMessage('올바른 날짜입니다: ' + DateToStr(D)) else ShowMessage('잘못된 날짜 형식입니다: ' + S).. 2025. 7. 8.
TIniFile로 손쉬운 설정 파일 관리하기 TIniFile로 손쉬운 설정 파일 관리하기 델파이 애플리케이션에서 사용자 환경설정이나 간단한 데이터를 파일에 저장할 때 INI 파일은 가볍고 편리한 방식입니다. TIniFile 클래스를 이용하면 레지스트리나 복잡한 DB 없이도 Key=Value 형태로 손쉽게 읽고 쓸 수 있습니다. 설정 파일은 텍스트 에디터로도 바로 수정 가능하므로 디버깅과 유지보수 측면에서도 유리합니다. uses System.IniFiles, System.SysUtils; procedure SaveAppSettings; var Ini: TIniFile; FileName: string; begin FileName := ChangeFileExt(Application.ExeName, '.ini'); Ini :=.. 2025. 7. 7.
레코드(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.
TStringList로 정렬된 문자열 관리하기 TStringList로 정렬된 문자열 관리하기델파이에서 TStringList는 문자열 목록을 관리하는 데 매우 유용한 클래스입니다. 특히 Sorted 속성과 Duplicates 속성을 조합하면 자동 정렬과 중복 허용 여부를 제어할 수 있어 데이터를 효율적으로 다룰 수 있습니다. procedure TForm1.SortingStringList; var SL: TStringList; i: Integer; begin SL := TStringList.Create; try SL.Sorted := True; // 자동 정렬 활성화 SL.Duplicates := dupIgnore; // 중복 항목 무시 SL.Add('Banana'); SL.Add('Appl.. 2025. 7. 3.
이벤트 핸들러를 동적으로 연결하기 이벤트 핸들러를 동적으로 연결하기 델파이에서는 버튼 클릭이나 체크박스 변경 같은 이벤트에 대한 처리를 디자인 타임뿐만 아니라 런타임에서도 동적으로 설정할 수 있습니다. 이 기능은 UI 구성 요소를 동적으로 생성하거나 동작을 유연하게 제어할 때 유용합니다. procedure TForm1.DynamicButtonClick(Sender: TObject); begin ShowMessage('동적으로 연결된 버튼 클릭 이벤트!'); end; procedure TForm1.FormCreate(Sender: TObject); var NewButton: TButton; begin NewButton := TButton.Create(Self); NewButton.Parent := Self; Ne.. 2025. 7. 2.
Try-Finally 구조로 자원 안정적으로 해제하기 Try-Finally 구조로 자원 안정적으로 해제하기Delphi에서는 객체를 생성한 후 반드시 해제해야 메모리 누수를 방지할 수 있습니다. try-finally 구조를 활용하면 예외가 발생하더라도 자원을 안전하게 해제할 수 있어 매우 중요합니다. 특히 TList, TStringList, TMemoryStream 등 객체를 사용하는 모든 경우에 적용해야 하는 기본 규칙입니다. uses System.Classes, System.SysUtils; procedure SafeStringListExample; var MyList: TStringList; begin MyList := TStringList.Create; try MyList.Add('Delphi'); MyList.A.. 2025. 7. 1.
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.