전체 글1098 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. ExtractFilePath와 ExtractFileName을 활용한 파일 경로 분리 ExtractFilePath와 ExtractFileName을 활용한 파일 경로 분리 파일 전체 경로에서 폴더 경로 또는 파일 이름만 따로 추출하고 싶을 때 ExtractFilePath와 ExtractFileName 함수를 사용하면 매우 편리합니다. 설정 파일, 로그 파일, 사용자 선택 파일 처리 시 자주 사용됩니다. uses System.SysUtils; procedure SplitFilePath; var FullPath, PathOnly, FileOnly: string; begin FullPath := 'C:\Program Files\MyApp\data.txt'; PathOnly := ExtractFilePath(FullPath); // "C:\Program Files\MyApp.. 2025. 4. 3. null-coalescing 연산자 ??로 기본값 설정하기 null-coalescing 연산자 ??로 기본값 설정하기 C#의 ?? 연산자는 값이 null일 경우 대체값을 지정할 수 있는 간결한 방법을 제공합니다. 널 검사와 기본값 할당을 한 줄로 처리할 수 있어 코드가 훨씬 깔끔해집니다. using System; class Program { static void Main() { string name = null; string displayName = name ?? "사용자"; Console.WriteLine($"환영합니다, {displayName}님!"); } } 출력 결과 환영합니다, 사용자님! ● name ?? "사용자"는 name이 null이면 "사용자"를 반환합니다. ● 이 방식은 긴 i.. 2025. 4. 3. TComboBox.Items.Objects를 활용한 데이터 연동 TComboBox.Items.Objects를 활용한 데이터 연동 TComboBox에 표시되는 항목에 추가 정보를 함께 저장하고 싶을 때 Items.Objects를 활용하면 유용합니다. 각 항목에 객체 또는 포인터를 연결해 비즈니스 로직과 연동할 수 있습니다. procedure TForm1.FormCreate(Sender: TObject); begin ComboBox1.Items.AddObject('사과', TObject(PtrInt(100))); ComboBox1.Items.AddObject('바나나', TObject(PtrInt(200))); ComboBox1.Items.AddObject('오렌지', TObject(PtrInt(300))); end; procedure TForm1.Com.. 2025. 4. 2. StringBuilder로 문자열 성능 향상시키기 StringBuilder로 문자열 성능 향상시키기 문자열을 반복적으로 연결할 때 + 연산자를 사용하는 대신, StringBuilder를 사용하면 성능이 크게 향상됩니다. 특히 루프 안에서 문자열을 누적할 경우 StringBuilder는 메모리 낭비를 방지해 줍니다. using System; using System.Text; class Program { static void Main() { StringBuilder sb = new StringBuilder(); for (int i = 1; i { sb.Append("Line "); sb.Append(i); sb.AppendLine().. 2025. 4. 2. TStringStream을 활용한 문자열과 스트림 간 변환 TStringStream을 활용한 문자열과 스트림 간 변환 TStringStream은 문자열을 스트림처럼 다룰 수 있게 해주는 클래스입니다. 주로 파일, 네트워크, JSON 처리 등에서 문자열을 스트림 형태로 넘겨야 할 때 유용하게 사용 uses System.Classes, System.SysUtils; procedure UseStringStream; var Str: string; Stream: TStringStream; begin Str := '이 문자열은 스트림으로 변환됩니다.'; Stream := TStringStream.Create(Str, TEncoding.UTF8); try // 스트림 데이터를 다시 문자열로 가져오기 Stream.Position := 0.. 2025. 4. 1. switch 표현식으로 간결하게 조건 분기하기 switch 표현식으로 간결하게 조건 분기하기C# 8.0부터는 기존의 switch 문보다 간단하고 표현력 있는 switch 표현식을 사용할 수 있습니다. 코드를 더 간결하게 만들고 가독성을 높이는 데 효과적 using System; class Program { static void Main() { string role = "admin"; string permission = role switch { "admin" => "모든 권한", "user" => "읽기/쓰기", "guest" => "읽기 전용", _ => "권한 없음" }; Co.. 2025. 4. 1. 이전 1 2 3 4 ··· 55 다음