전체 글1280 TStringList를 이용한 Key-Value 데이터 관리 TStringList를 이용한 Key-Value 데이터 관리간단한 설정값이나 임시 데이터를 관리할 때 TStringList의 NameValueSeparator와 Values 속성을 사용하면 효율적으로 Key-Value 형태 데이터를 다룰 수 있습니다. procedure TForm1.Button1Click(Sender: TObject); var SL: TStringList; begin SL := TStringList.Create; try SL.NameValueSeparator := '='; SL.Values['Server'] := '127.0.0.1'; SL.Values['Port'] := '1433'; SL.Values['User'] := 'admin'; .. 2025. 9. 15. LINQ SelectMany로 컬렉션 플래튼닝 LINQ SelectMany로 컬렉션 플래튼닝SelectMany는 컬렉션의 컬렉션을 단일 시퀀스로 변환하는 LINQ 메서드로, 중첩된 배열이나 리스트를 평탄화(flatten)하는 데 사용됩니다. 목적은 계층적 데이터 구조를 간단히 처리하여 쿼리를 효율적으로 만드는 것입니다. 복잡한 조인을 피하고 가독성을 높입니다. using System; using System.Collections.Generic; using System.Linq; public class LINQExample { public void FlattenNestedLists() { var nestedList = new List> { new List { "A1", "A2" },.. 2025. 9. 15. TParallel.For로 루프 병렬화하여 멀티코어 성능 끌어올리기 (Advanced) TParallel.For로 루프 병렬화하여 멀티코어 성능 끌어올리기 (Advanced) CPU 연산이 많은 루프를 그대로 돌리면 코어가 여러 개 있어도 한 코어만 쓰는 경우가 많습니다. System.Threading의 TParallel.For를 사용하면 동일한 루프를 자동으로 작업 분할해 여러 코어에서 동시에 처리하므로 실행 시간이 크게 단축될 수 있습니다. uses System.SysUtils, System.Threading, System.SyncObjs, System.Diagnostics; procedure ParallelSumDemo; const N = 5_000_000; var Data: TArray; I: Integer; Total: Int64; SW: TStopwa.. 2025. 9. 11. 델리게이트와 이벤트를 활용한 느슨한 결합 구현 델리게이트와 이벤트를 활용한 느슨한 결합 구현델리게이트는 메서드 시그니처를 나타내는 타입으로, 함수를 변수처럼 다루며 이벤트는 델리게이트를 기반으로 한 발행-구독 패턴입니다. 목적은 클래스 간 결합도를 낮추고, 확장성을 높이는 것입니다. 이벤트 핸들러를 등록하여 변경 사항을 알릴 때 유용합니다. using System; public class Publisher { // 델리게이트 정의 public delegate void NotificationHandler(string message); // 이벤트 선언 public event NotificationHandler OnNotification; public void Notify(string message) { .. 2025. 9. 11. notBit 라이센스 test 2025. 9. 10. Record Helpers로 코드 가독성 높이기 (Intermediate) Record Helpers로 코드 가독성 높이기 (Intermediate) 델파이(Delphi)에서 record는 가벼운 데이터 구조체로 자주 사용됩니다. 하지만 기능이 제한적일 수 있습니다. record helper를 사용하면 기존 record에 메서드나 속성을 확장해 넣을 수 있어, 코드의 가독성과 재사용성을 크게 향상시킬 수 있습니다. uses System.SysUtils; type TPoint = record X, Y: Integer; end; // Record Helper 선언 TPointHelper = record helper for TPoint function ToString: string; function DistanceTo(const P: TP.. 2025. 9. 10. 익명 메서드와 람다식(Anonymous Methods & Lambda Expressions) 익명 메서드와 람다식(Anonymous Methods & Lambda Expressions)C#에서는 **익명 메서드(Anonymous Method)**와 ** 람다식(Lambda Expression)**을 사용해 코드를 간결하게 작성할 수 있습니다. 특히, 이벤트 처리나 간단한 함수를 inline으로 작성할 때 매우 유용합니다. using System; using System.Collections.Generic; class Program { static void Main() { // 익명 메서드 사용 Action greet = delegate(string name) { Console.WriteLine($"안녕하세요, {na.. 2025. 9. 10. TStringList 활용하기 (Intermediate) TStringList 활용하기 (Intermediate)델파이(Delphi)에서 텍스트 데이터를 다룰 때 가장 많이 쓰이는 클래스 중 하나가 TStringList입니다. 파일에서 문자열을 읽고 쓰거나, 키-값 쌍을 관리하거나, 정렬과 검색까지 간단하게 처리할 수 있습니다. uses System.SysUtils, System.Classes; procedure TestStringList; var SL: TStringList; begin SL := TStringList.Create; try // 문자열 추가 SL.Add('Apple'); SL.Add('Banana'); SL.Add('Cherry'); // 특정 인덱스 접근 Writeln('첫 번째.. 2025. 9. 9. default 리터럴로 간결한 초기화 default 리터럴로 간결한 초기화C# 7.1부터 default 리터럴을 사용하면 값 타입이나 제네릭 타입을 간단히 초기화할 수 있습니다. 이전에는 default(T)처럼 타입을 명시해야 했지만, 이제는 default만 써도 컴파일러가 타입을 추론하여 기본값(숫자는 0, bool은 false, 참조형은 null 등)을 지정합니다. using System; class Program { static void PrintDefault() { // 제네릭 타입에 대해 간결하게 기본값 할당 T value = default; Console.WriteLine($"Type: {typeof(T)}, Default: {value}"); } st.. 2025. 9. 9. TFDQuery.FieldByName 성능 최적화하기 TFDQuery.FieldByName 성능 최적화하기반복 루프 안에서 FieldByName을 직접 호출하면 성능 저하가 발생할 수 있습니다. 필드 객체를 캐싱해두면 처리 속도를 크게 개선할 수 있습니다. procedure OptimizeFieldAccess(Qry: TFDQuery); var FName, FEmail: TField; begin Qry.SQL.Text := 'SELECT Name, Email FROM Customers'; Qry.Open; // 필드 캐싱 FName := Qry.FieldByName('Name'); FEmail := Qry.FieldByName('Email'); while not Qry.Eof do begin // 반복 루프에서 직접 .. 2025. 9. 8. 문자열 보간(String Interpolation) 문자열 보간(String Interpolation)C# 6.0부터는 **문자열 보간(String Interpolation)**을 사용할 수 있습니다. + 연산자나 string.Format() 대신 $ 기호를 사용하여 문자열 안에서 변수를 직접 삽입할 수 있습니다. 코드 가독성이 좋아지고 유지보수가 쉬워지는 장점이 있습니다. using System; class Program { static void Main() { string name = "Alice"; int age = 25; // 문자열 보간 사용 string message = $"이름: {name}, 나이: {age}"; Console.WriteLine(messa.. 2025. 9. 8. TMonitor를 이용한 객체 동기화 (Advanced) TMonitor를 이용한 객체 동기화 (Advanced)멀티스레드 환경에서 여러 스레드가 동일한 객체에 접근할 경우, 동기화가 필요합니다. TCriticalSection은 프로세스 내 자원 보호에 유용하지만, 델파이(Delphi)에서는 TMonitor라는 더 현대적이고 객체 지향적인 동기화 방법을 제공합니다. TMonitor는 객체 자체에 대한 잠금(lock)을 제공하며, Wait, Pulse, PulseAll을 통해 스레드 간 조건 동기화도 가능하게 합니다. uses System.SysUtils, System.Classes; type TSharedBuffer = class private FData: string; public procedure WriteData(.. 2025. 9. 5. stackalloc으로 고성능 메모리 할당 stackalloc으로 고성능 메모리 할당stackalloc 키워드는 힙 대신 스택 메모리에 고정 크기 배열을 직접 할당할 수 있게 해줍니다. 가비지 컬렉션 부담이 줄어들고, 빠른 메모리 접근이 가능하여 임시 버퍼, 문자열 처리, 고빈도 연산에서 성능을 크게 향상시킬 수 있습니다. using System; class Program { static void Main() { // 스택에 100개의 int 배열을 직접 할당 Span buffer = stackalloc int[100]; for (int i = 0; i { buffer[i] = i * 2; } Console.WriteLi.. 2025. 9. 5. TCriticalSection으로 멀티스레드에서 자원 보호하기 (Intermediate) TCriticalSection으로 멀티스레드에서 자원 보호하기 (Intermediate)델파이(Delphi)에서 멀티스레드 프로그램을 작성할 때, 여러 스레드가 동시에 같은 변수나 객체를 수정하면 Race Condition(경쟁 상태) 이 발생할 수 있습니다. 이런 문제를 막으려면 스레드 간에 공유되는 자원 접근을 동기화해야 합니다. TCriticalSection은 간단하게 임계 구역(critical section)을 설정하여 한 번에 한 스레드만 진입하도록 보장합니다. uses System.Classes, System.SyncObjs, System.SysUtils; var Counter: Integer = 0; CS: TCriticalSection; procedure Incremen.. 2025. 9. 4. 확장 메서드(Extension Methods)로 클래스 기능 확장하기 확장 메서드(Extension Methods)로 클래스 기능 확장하기 C#에서는 **확장 메서드(Extension Method)**를 사용해 기존 클래스에 새로운 기능을 추가할 수 있습니다. 원본 코드를 수정하거나 상속하지 않고도, 정적 메서드를 인스턴스 메서드처럼 호출할 수 있다는 장점이 있습니다. using System; public static class StringExtensions { // 문자열의 첫 글자를 대문자로 변환하는 확장 메서드 public static string ToFirstUpper(this string str) { if (string.IsNullOrEmpty(str)) return str; return char.ToUpper.. 2025. 9. 4. 메일주소 유효 검증 uses System.RegularExpressions; procedure ValidateEmail(const Email: string); var Regex: TRegEx; begin Regex := TRegEx.Create('^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'); if Regex.IsMatch(Email) then ShowMessage('유효한 이메일입니다.') else ShowMessage('유효하지 않은 이메일입니다.'); end; 2025. 9. 3. TStringGrid에서 행 전체 복사/붙여넣기 기능 구현하기 TStringGrid에서 행 전체 복사/붙여넣기 기능 구현하기 업무용 그리드 화면에서 사용자가 행 전체를 복사/붙여넣기 할 수 있으면 데이터 입력 효율성이 크게 올라갑니다. uses Vcl.Clipbrd; procedure CopyRowToClipboard(Grid: TStringGrid; ARow: Integer); var Col: Integer; Line: string; begin Line := ''; for Col := 0 to Grid.ColCount - 1 do begin Line := Line + Grid.Cells[Col, ARow]; if Col Line := Line + #9; // 탭 구분자 end; Clipboard.AsText .. 2025. 9. 3. 루프에서 문자열 결합은 TStringBuilder로 최적화하기 (Intermediate) 루프에서 문자열 결합은 TStringBuilder로 최적화하기 (Intermediate)루프에서 S := S + ...로 문자열을 이어 붙이면 매번 새 버퍼가 생성되어 메모리 재할당과 복사가 반복됩니다. TStringBuilder는 내부 버퍼를 확장해가며 추가하기 때문에 할당/복사 횟수를 크게 줄여 대용량 처리에서 유리합니다. 초기 용량(Capacity)을 넉넉히 잡으면 더 빨라집니다. program StringBuilderDemo; {$APPTYPE CONSOLE} uses System.SysUtils, System.Diagnostics; function BuildWithPlus(Count: Integer): string; var i: Integer; S: string; begin .. 2025. 9. 3. Memory<T>와 Span<T>로 안전한 메모리 관리 Memory와 Span로 안전한 메모리 관리 Span와 Memory는 배열, 문자열, 네이티브 메모리 등 연속된 메모리를 안전하고 효율적으로 다룰 수 있도록 지원합니다. Span는 스택 기반에서 빠르게 동작하며, Memory는 힙에서도 사용할 수 있고 비동기 코드에서도 안전하게 전달할 수 있습니다. using System; class Program { static void Main() { int[] numbers = { 10, 20, 30, 40, 50 }; // 배열 일부를 Span으로 슬라이스 Span slice = numbers.AsSpan(1, 3); foreach (var n in slice) { .. 2025. 9. 3. Const 매개변수로 성능 최적화하기 (Intermediate) Const 매개변수로 성능 최적화하기 (Intermediate) 델파이(Delphi)에서 큰 레코드나 긴 문자열을 함수에 전달할 때, 기본 매개변수는 값 복사가 일어나 성능이 떨어질 수 있습니다. 이때 const 키워드를 사용하면 참조 방식으로 전달되어 불필요한 복사가 줄어들고, 성능이 향상됩니다. type TLargeRecord = record Data: array[1..1000] of Integer; end; // 값 복사 방식 (비효율적일 수 있음) function ProcessData(Value: TLargeRecord): Integer; begin Result := Value.Data[1]; end; // const 매개변수 방식 (참조 전달, 성능 최적화) functio.. 2025. 9. 2. 이전 1 2 3 4 ··· 64 다음