전체 글1104 Trim, TrimLeft, TrimRight로 공백 제거하기 Trim, TrimLeft, TrimRight로 공백 제거하기사용자 입력, 파일 처리, 문자열 비교를 할 때 앞뒤 공백이 문제를 일으킬 수 있습니다. 델파이에서는 Trim 관련 함수를 통해 문자열의 공백을 손쉽게 제거할 수 있어 데이터 정제에 매우 유용합니다. uses System.SysUtils; procedure TrimExample; var RawText, CleanedText: string; begin RawText := ' Hello Delphi! '; CleanedText := Trim(RawText); ShowMessage('[' + CleanedText + ']'); // 결과: [Hello Delphi!] end; Trim: 문자열 양쪽 끝 공백 제거 Tr.. 2025. 4. 17. params 키워드로 가변 인자 받기 params 키워드로 가변 인자 받기C#의 params 키워드를 사용하면 인자 개수에 제한 없이 배열처럼 값을 전달할 수 있어 유연한 메서드 구현이 가능합니다. 오버로드 없이도 다양한 수의 인자를 처리할 수 있어 코드가 간결해집니다. using System; class Program { static void Main() { PrintNumbers(1, 2, 3); PrintNumbers(10, 20); PrintNumbers(); // 인자 없이도 호출 가능 } static void PrintNumbers(params int[] numbers) { Console.WriteLine("입력된 숫자들: " + s.. 2025. 4. 17. ChangeFileExt를 사용한 파일 확장자 변경하기 ChangeFileExt를 사용한 파일 확장자 변경하기 ChangeFileExt 함수는 파일 경로의 확장자를 쉽게 변경할 수 있게 해주는 유틸리티입니다. 예를 들어 .txt 파일을 .bak 파일로 바꾸거나, 특정 작업 후 저장 포맷을 바꿔야 할 때 매우 유용합니다. uses System.SysUtils; procedure ChangeExtensionDemo; var OriginalFile, NewFile: string; begin OriginalFile := 'C:\Backup\data.txt'; NewFile := ChangeFileExt(OriginalFile, '.bak'); ShowMessage('변경된 파일명: ' + NewFile); end; 기존 경로에서 확장자만 바.. 2025. 4. 16. enum을 활용한 의미 있는 상수 집합 정의 enum을 활용한 의미 있는 상수 집합 정의 enum(열거형)은 관련된 상수 값을 이름으로 표현할 수 있게 해주는 C#의 기능입니다. 의미 있는 이름으로 코드를 작성하면 가독성, 유지보수성이 모두 좋아집니다. using System; enum OrderStatus { Pending, Processing, Shipped, Delivered, Cancelled } class Program { static void Main() { OrderStatus status = OrderStatus.Shipped; Console.WriteLine($"주문 상태: {status}"); if (status == OrderSta.. 2025. 4. 16. ExtractFileExt를 사용한 파일 확장자 추출 ExtractFileExt를 사용한 파일 확장자 추출 파일 경로에서 확장자를 따로 분리하고 싶을 때는 ExtractFileExt 함수를 사용하면 매우 간단합니다. 파일 유형 판단이나 확장자 필터링, 조건 분기 등에 자주 쓰입니다. uses System.SysUtils; procedure ShowFileExtension; var FilePath, Extension: string; begin FilePath := 'C:\Users\Documents\report.pdf'; Extension := ExtractFileExt(FilePath); // ".pdf" ShowMessage('확장자: ' + Extension); end; ExtractFileExt는 경로에서 확장자만 추출함 (점 .. 2025. 4. 15. string interpolation으로 문자열 조합 간결하게 하기 string interpolation으로 문자열 조합 간결하게 하기C#의 문자열 보간(String Interpolation) 기능을 사용하면 문자열을 더 간단하고 가독성 좋게 조합할 수 있습니다. 기존의 + 연산이나 string.Format()보다 더 직관적인 문법을 제공합니다. using System; class Program { static void Main() { string name = "홍길동"; int age = 21; string message = $"안녕하세요, 제 이름은 {name}이고 나이는 {age}살입니다."; Console.WriteLine(message); } } 출력 결과 안녕하세요, 제 이름은 홍.. 2025. 4. 15. Now와 FormatDateTime을 활용한 현재 날짜 및 시간 포맷 출력 Now와 FormatDateTime을 활용한 현재 날짜 및 시간 포맷 출력 델파이에서 Now 함수는 현재 날짜와 시간을 반환합니다. 이를 FormatDateTime 함수와 함께 사용하면 다양한 형식으로 날짜와 시간을 손쉽게 표시할 수 있습니다. 로그 기록, UI 표기, 파일명 생성 등에 자주 활용됩니다. uses System.SysUtils; procedure ShowCurrentDateTime; var CurrentDateTime: string; begin CurrentDateTime := FormatDateTime('yyyy-mm-dd hh:nn:ss', Now); ShowMessage('현재 시간: ' + CurrentDateTime); end; ● 'yyyy', 'mm', '.. 2025. 4. 14. try-catch-finally 구문으로 예외 처리 완전 정복! try-catch-finally 구문으로 예외 처리 완전 정복! C#에서는 프로그램 실행 중 예외 상황이 발생할 수 있으며, 이를 try-catch-finally 구문으로 안전하게 처리할 수 있습니다. 오류를 잡고, 리소스를 정리하고, 사용자에게 친절한 메시지를 제공하는 것은 프로 개발자의 기본입니다! using System; class Program { static void Main() { try { Console.Write("숫자를 입력하세요: "); int number = int.Parse(Console.ReadLine()); Console.WriteLine($"입력한 숫자: {number}".. 2025. 4. 14. Screen.Cursors를 이용한 마우스 커서 변경 Screen.Cursors를 이용한 마우스 커서 변경 사용자에게 작업 진행 중임을 시각적으로 알려주고 싶을 때 마우스 커서를 바꾸는 것이 좋은 방법입니다. Screen.Cursors를 사용하면 특정 작업 중에는 '모래시계', 완료 후에는 기본 커서로 되돌리는 등 UX 향상에 도움이 됩니다. uses Vcl.Forms, Vcl.Controls, Vcl.Dialogs; procedure LongRunningTask; begin Screen.Cursor := crHourGlass; // 모래시계 커서 표시 try Sleep(3000); // 3초간 작업 ShowMessage('작업 완료!'); finally Screen.Cursor := crDefault; // .. 2025. 4. 12. Tuple을 활용한 다중 값 반환 Tuple을 활용한 다중 값 반환 C#에서는 Tuple을 사용하여 메서드에서 여러 값을 간단하게 반환할 수 있습니다. 클래스를 만들 필요 없이 깔끔한 반환 구조를 만들 수 있어 매우 유용합니다. using System; class Program { static void Main() { var (sum, product) = Calculate(4, 5); Console.WriteLine($"합계: {sum}, 곱셈: {product}"); } static (int, int) Calculate(int a, int b) { return (a + b, a * b); } } Tuple은 여러 값을 한 번에 반환할 때 사용되며 (.. 2025. 4. 12. ForceDirectories로 중첩된 폴더 자동 생성하기 ForceDirectories로 중첩된 폴더 자동 생성하기파일을 저장할 때 필요한 폴더가 없으면 오류가 발생할 수 있습니다. 이때 ForceDirectories 함수를 사용하면 다단계 폴더도 한 번에 생성할 수 있어 매우 유용합니다. 특히 백업 폴더나 사용자 디렉토리를 미리 생성해야 할 때 좋습니다. uses System.SysUtils; procedure CreateFolderStructure; var FolderPath: string; begin FolderPath := 'C:\MyApp\Data\Backup\2025\04\11'; if ForceDirectories(FolderPath) then ShowMessage('폴더가 성공적으로 생성되었습니다!') else .. 2025. 4. 11. lock 키워드로 멀티스레딩 동기화 lock 키워드로 멀티스레딩 동기화 멀티스레드 환경에서는 하나의 리소스를 여러 스레드가 동시에 접근할 수 있기 때문에 데이터 무결성을 유지하려면 동기화가 필수입니다. C#의 lock 키워드를 사용하면 간단하게 **임계 구역(Critical Section)**을 만들어 스레드 충돌을 방지할 수 있습니다. using System; using System.Threading; class Counter { private int _count = 0; private readonly object _lock = new object(); public void Increment() { lock (_lock) { _count++; .. 2025. 4. 11. TThread.Queue를 활용한 안전한 UI 업데이트 TThread.Queue를 활용한 안전한 UI 업데이트델파이에서 스레드 작업을 할 때 직접 UI 컴포넌트에 접근하면 오류가 발생할 수 있습니다. 이때 TThread.Queue를 사용하면 UI 스레드에서 안전하게 코드를 실행할 수 있습니다. 백그라운드 작업 중 UI에 메시지를 띄우거나 데이터를 갱신할 때 매우 유용합니다. uses System.Classes, Vcl.Dialogs; procedure StartBackgroundTask; begin TThread.CreateAnonymousThread(procedure begin Sleep(3000); // 3초간 작업 수행 TThread.Queue(nil, procedure begin ShowMessage.. 2025. 4. 10. ??= 널 병합 할당 연산자 ??= 널 병합 할당 연산자C# 8.0부터 도입된 ??= 연산자는 값이 null일 경우에만 할당을 수행합니다. 조건문 없이 깔끔하게 기본값을 설정할 수 있어 가독성과 생산성을 모두 향상시킬 수 있습니다. using System; class Program { static void Main() { string name = null; name ??= "기본 이름"; Console.WriteLine($"사용자 이름: {name}"); } } 출력 결과 사용자 이름: 기본 이름 ● ??=는 변수에 값이 null일 경우에만 오른쪽 값을 할당합니다. ● if (x == null) x = y;를 더 간결하게 표현한 것과 동일합니다. ● 코드 흐름을 깔끔.. 2025. 4. 10. Application.ProcessMessages의 역할과 주의점 Application.ProcessMessages의 역할과 주의점 델파이에서 Application.ProcessMessages는 현재 대기 중인 Windows 메시지를 즉시 처리하도록 하는 함수입니다. 주로 루프나 지연 작업 중 UI가 멈추지 않도록 할 때 사용됩니다. 하지만 과도한 사용은 오히려 성능과 안정성에 부정적인 영향을 줄 수 있어 신중하게 써야 합니다. procedure TForm1.Button1Click(Sender: TObject); var I: Integer; begin for I := 1 to 100 do begin Label1.Caption := Format('진행 중: %d%%', [I]); Application.ProcessMessages; // U.. 2025. 4. 8. foreach와 yield return을 활용한 커스텀 이터레이터 foreach와 yield return을 활용한 커스텀 이터레이터 C#의 yield return을 사용하면 반복자의 상태를 직접 관리하지 않고도 커스텀 이터레이터를 간결하게 구현할 수 있습니다. 필터링, 지연 실행, 파이프라인 처리 등에 매우 유용합니다. using System; using System.Collections.Generic; class Program { static void Main() { foreach (int prime in GetPrimesBelow(10)) { Console.WriteLine($"소수: {prime}"); } } static IEnumerable GetPrimesBelow(.. 2025. 4. 8. TFormatSettings를 사용한 지역화된 숫자/날짜 포맷 처리 TFormatSettings를 사용한 지역화된 숫자/날짜 포맷 처리 델파이에서 숫자나 날짜 형식을 지역 설정에 따라 다르게 출력해야 할 경우 TFormatSettings를 사용하면 유용합니다. 특히 다국어 지원이나 사용자 맞춤 포맷이 필요할 때 매우 효과적입니다. uses System.SysUtils; procedure ShowLocalizedDateAndNumber; var FS: TFormatSettings; FormattedDate, FormattedNumber: string; begin FS := TFormatSettings.Create('fr-FR'); // 프랑스 지역 설정 FormattedDate := FormatDateTime('dd mmmm yyyy', Date, .. 2025. 4. 7. s 및 패턴 매칭으로 타입 검사 간소화하기 s 및 패턴 매칭으로 타입 검사 간소화하기C#의 is 키워드와 패턴 매칭을 활용하면 객체의 타입을 검사하고 동시에 캐스팅까지 깔끔하게 처리할 수 있습니다. as와 null 체크보다 안전하고, switch와 함께 사용하면 더 강력한 조건 분기를 만들 수 있습니다. using System; class Animal { } class Dog : Animal { public void Bark() => Console.WriteLine("멍멍!"); } class Program { static void Main() { Animal pet = new Dog(); if (pet is Dog dog) { dog.Bark(); .. 2025. 4. 7. Interface를 활용한 의존성 주입 구조 만들기 Interface를 활용한 의존성 주입 구조 만들기 Interface를 사용하면 클래스 구현에 의존하지 않고 코드를 작성할 수 있어, 유지보수성과 확장성이 높아집니다. 델파이에서는 인터페이스 기반 설계를 통해 DI(Dependency Injection) 패턴을 쉽게 구현할 수 있습니다. type IPrinter = interface ['{3B770F50-22DA-4E69-8F28-56FA4E09B307}'] procedure Print; end; TConsolePrinter = class(TInterfacedObject, IPrinter) procedure Print; end; TService = class private FPrinter: IPrin.. 2025. 4. 4. readonly 필드로 불변 객체 만들기 readonly 필드로 불변 객체 만들기 readonly 키워드는 객체 생성 이후 값을 변경할 수 없는 필드를 선언할 때 사용합니다. 이 키워드를 통해 클래스의 상태를 안정적으로 유지할 수 있으며, 특히 멀티스레딩 환경에서 유용합니다. using System; class Circle { private readonly double _radius; public Circle(double radius) { _radius = radius; } public double Area => Math.PI * _radius * _radius; } class Program { static void Main() { Circle c = new C.. 2025. 4. 4. 이전 1 2 3 4 ··· 56 다음