CSharp/CShap Tip55 ValueTask로 메모리 효율적인 비동기 처리하기 ValueTask로 메모리 효율적인 비동기 처리하기 Task는 비동기 작업 결과를 나타내는 객체로 매우 널리 쓰이지만, 짧은 실행 경로에서는 불필요한 힙 할당이 발생할 수 있습니다. **ValueTask**는 구조체(struct) 기반의 경량 비동기 반환 타입으로, 결과가 이미 계산된 경우 불필요한 Task 객체 생성을 방지합니다. 메모리 효율이 높고 GC 부담을 줄일 수 있습니다. 단, ValueTask는 Task보다 제약이 많아 잘못 사용하면 오히려 성능이 저하될 수 있습니다. 따라서 "짧은 실행 경로" 또는 "동기적으로 결과를 즉시 반환할 가능성이 높은 비동기 메서드"에서만 사용하는 것이 좋습니다. using System; using Systehttp://m.Threading.Tasks;cla.. 2025. 10. 16. ValueTask로 메모리 효율적인 비동기 처리하기 ValueTask로 메모리 효율적인 비동기 처리하기 Task는 비동기 작업 결과를 나타내는 객체로 매우 널리 쓰이지만, 짧은 실행 경로에서는 불필요한 힙 할당이 발생할 수 있습니다. **ValueTask**는 구조체(struct) 기반의 경량 비동기 반환 타입으로, 결과가 이미 계산된 경우 불필요한 Task 객체 생성을 방지합니다. 메모리 효율이 높고 GC 부담을 줄일 수 있습니다. 단, ValueTask는 Task보다 제약이 많아 잘못 사용하면 오히려 성능이 저하될 수 있습니다. 따라서 "짧은 실행 경로" 또는 "동기적으로 결과를 즉시 반환할 가능성이 높은 비동기 메서드"에서만 사용하는 것이 좋습니다. using System; using Systehttp://m.Threading.Tasks;cla.. 2025. 10. 15. 병렬 처리: TParallel.For 활용하기 병렬 처리: TParallel.For 활용하기TParallel.For는 델파이의 멀티스레딩 라이브러리(Parallel Programming Library, PPL)에 포함된 병렬 반복문 기능입니다. 반복문을 여러 CPU 코어에 나누어 실행해 성능을 향상시킵니다. 데이터 집합을 병렬로 처리할 때 사용 CPU 연산이 많은 반복문 최적화할 때 사용 대규모 데이터 분석, 이미지 처리, 수학 계산 등에 활용 사용 program ParallelForDemo; {$APPTYPE CONSOLE} uses System.SysUtils, System.Threading, System.Diagnostics; procedure RunDemo; var SW: TStopwatch; I: Integer; Re.. 2025. 10. 13. HttpClientFactory로 안정적이고 효율적인 API 통신 관리하기 HttpClientFactory로 안정적이고 효율적인 API 통신 관리하기 HttpClient는 재사용 가능한 객체지만, 잘못 사용할 경우 소켓 고갈(Socket Exhaustion) 문제가 발생할 수 있습니다. new HttpClient()를 매번 생성하면 내부 TCP 연결이 완전히 해제되지 않아 성능 저하와 리소스 누수가 일어납니다. .NET Core 2.1부터 도입된 **IHttpClientFactory**는 이러한 문제를 해결하기 위해 HttpClient의 수명 관리 자동화, Named/Typed Client 지원, Retry / Timeout / Logging 설정 중앙화 기능을 제공합니다. 결과적으로, HttpClientFactory를 사용하면 성능 향상, 유지보수 편의성, 보안 강화를 .. 2025. 10. 13. 전역 using 지시문으로 프로젝트 코드 간결화 전역 using 지시문으로 프로젝트 코드 간결화기존 C# 프로젝트에서는 모든 파일에 공통 using을 반복적으로 선언해야 했음. 전역 using 지시문(global using)을 사용하면 프로젝트 전체에 한 번만 선언 가능. 불필요한 중복 제거 → 코드 가독성 및 유지보수성 향상. 주의: 너무 많은 전역 using은 네임스페이스 충돌 가능성을 높임. // Before: 모든 파일에 중복 선언 using System; using System.Collections.Generic; using System.Linq; class Demo { static void Main() { List nums = new() { 1, 2, 3 }; Console.WriteLine(num.. 2025. 10. 1. 문자열 보간과 숫자 포맷 활용하기 문자열 보간과 숫자 포맷 활용하기문자열 보간($"...")은 단순히 변수를 출력하는 것뿐 아니라, 숫자나 날짜를 서식 지정하여 가독성 있게 표현할 수 있습니다. 예를 들어, 통화, 소수점 자리수, 날짜 형식 등을 한 줄 코드로 깔끔하게 처리할 수 있습니다. using System; class Program { static void Main() { string product = "노트북"; double price = 1599999.5; DateTime today = DateTime.Now; string message = $"상품: {product}, 가격: {price:C}, 날짜: {today:yyyy-MM-dd}"; .. 2025. 9. 22. Span<T> & stackalloc으로 무할당(Zero-alloc) 문자열 파싱하기 Span & stackalloc으로 무할당(Zero-alloc) 문자열 파싱하기 ReadOnlySpan와 stackalloc을 활용하면 Substring/Split로 생기는 힙 할당 없이 문자열을 슬라이스하고 파싱할 수 있어 GC 부담을 크게 줄일 수 있습니다. 아래 예시는 로그 라인 "YYYY-MM-DD|Price=12345|Qty=7"에서 날짜/가격/수량을 할당 없이 추출한 뒤, stackalloc으로 yyyyMMdd 형식의 날짜 문자열을 만들어냅니다. using System; class Program { static void Main() { string line = "2025-09-19|Price=12345|Qty=7"; ReadOnlySpan sp.. 2025. 9. 19. 문자열 보간($"")으로 가독성 향상 문자열 보간($"")으로 가독성 향상C# 6.0부터 제공되는 문자열 보간(string interpolation) 기능은 $"..." 문법을 사용하여 변수나 표현식을 문자열 안에 직접 삽입할 수 있게 해줍니다. string.Format보다 간단하고 가독성이 높으며, 유지보수에도 유리합니다. using System; class Program { static void Main() { string name = "Kim"; int age = 30; // 기존 방식 string oldWay = string.Format("Name: {0}, Age: {1}", name, age); Console.WriteLine(oldWay).. 2025. 9. 16. 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. 익명 메서드와 람다식(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. readonly struct로 불변 값 타입 최적화 readonly struct로 불변 값 타입 최적화 C# 7.2부터 도입된 readonly struct는 구조체가 불변임을 보장하여, 값 복사 비용을 최소화하고 불변성을 유지할 수 있습니다. 특히 성능에 민감한 코드에서 안전하고 빠른 불변 값 타입을 정의할 때 유용합니다. using System; readonly struct Point { public int X { get; } public int Y { get; } public Point(int x, int y) { X = x; Y = y; } // 읽기 전용 메서드 - 값 타입 불변성 유지 public double Distance => Math.Sqrt(X * X + .. 2025. 9. 1. Dictionary에서 키 존재 여부 확인하기: ContainsKey 활용하기 Dictionary에서 키 존재 여부 확인하기: ContainsKey 활용하기Dictionary는 키-값 쌍을 저장하는 데 유용하지만, 존재하지 않는 키를 바로 접근하면 예외가 발생합니다. 이럴 땐 ContainsKey 메서드로 안전하게 키가 있는지 확인하고 값을 가져오는 습관을 들이는 것이 좋습니다. using System; using System.Collections.Generic; class Program { static void Main() { var userAges = new Dictionary { { "Alice", 25 }, { "Bob", 30 } }; string key .. 2025. 8. 28. nameof 연산자로 안전한 코드 작성 nameof 연산자로 안전한 코드 작성 nameof 연산자는 변수, 메서드, 클래스 등의 식별자 이름을 문자열로 가져오는 기능입니다. 하드코딩된 문자열 대신 nameof를 사용하면 리팩터링 시에도 안전하고, 코드의 유지보수성을 크게 높여줍니다. using System; class Person { public string Name { get; set; } } class Program { static void Main() { var person = new Person { Name = "Alice" }; // nameof 사용 전 Console.WriteLine("속성명: Name"); // nameof 사용 후 (안전한 방.. 2025. 8. 26. Span<T>를 이용한 고성능 문자열 처리 Span를 이용한 고성능 문자열 처리 Span는 관리 힙을 할당하지 않고 연속된 메모리 영역을 안전하게 다룰 수 있게 해주는 구조체입니다. 문자열을 잘라 쓰거나 배열 일부만 처리할 때 복사 없이 접근할 수 있어 성능과 메모리 효율이 뛰어납니다. using System; class Program { static void Main() { string text = "Hello, World!"; // 문자열 일부를 잘라내기 (복사 없음) ReadOnlySpan span = text.AsSpan(7, 5); Console.WriteLine(span.ToString()); // World //.. 2025. 8. 12. nameof로 하드코딩 문자열 없이 안전하게 이름 참조하기 nameof로 하드코딩 문자열 없이 안전하게 이름 참조하기 nameof는 변수/매개변수/속성/메서드 이름을 컴파일 타임에 문자열로 얻는 키워드예요. 예외 메시지, 로그, 바인딩 등에서 “매직 스트링”을 없애 오타와 리팩터링 버그를 막아줍니다. using System; class Program { static void Main() { PrintUser(null); } static void PrintUser(string userName) { if (userName is null) throw new ArgumentNullException(nameof(userName), $"{nameof(userName)} is requi.. 2025. 8. 11. 비동기 스트림(Asynchronous Streams)으로 대용량 데이터 처리 최적화 비동기 스트림(Asynchronous Streams)으로 대용량 데이터 처리 최적화C# 8.0부터 제공되는 비동기 스트림(IAsyncEnumerable)은 대용량 데이터나 네트워크 스트리밍 작업에서 메모리를 효율적으로 사용하고, 데이터가 준비되는 대로 처리할 수 있도록 도와줍니다. await foreach 문을 사용하면 비동기적으로 데이터를 하나씩 받아 처리할 수 있어, 전체 데이터를 모두 메모리에 로드할 필요가 없습니다. using System; using System.Collections.Generic; using Systehttp://m.Threading.Tasks;class Program { static async Task Main() { await foreach.. 2025. 8. 8. Dictionary<TKey, TValue>.TryGetValue()로 안전하게 값 조회하기 Dictionary.TryGetValue()로 안전하게 값 조회하기 컬렉션에서 키와 값을 함께 다룰 때 ContainsKey()와 인덱서를 사용하는 대신, TryGetValue()를 사용하면 한 번의 호출로 키 존재 여부와 값을 동시에 체크할 수 있어 더 효율적이고 성능도 우수합니다. using System; using System.Collections.Generic; class Program { static void Main() { var scores = new Dictionary { ["Alice"] = 90, ["Bob"] = 85 }; if (scores.TryGetValue("B.. 2025. 7. 31. using 문으로 리소스 자동 해제하기 using 문으로 리소스 자동 해제하기 C#에서는 IDisposable을 구현한 객체를 사용할 때 using 문을 사용하면 코드가 종료될 때 자동으로 리소스를 정리할 수 있습니다. 예를 들어 FileStream, StreamReader, SqlConnection 등의 객체는 Dispose() 호출이 필요한데, using 문을 쓰면 이를 자동화할 수 있어 안정성과 가독성이 높아집니다. using System; using System.IO; class Program { static void Main() { using (StreamReader reader = new StreamReader("example.txt")) { string .. 2025. 7. 17. Span<T>을 사용한 고성능 메모리 처리 Span을 사용한 고성능 메모리 처리Span는 배열, 문자열, 메모리 블록 등을 할당 없이 빠르게 조작할 수 있는 구조입니다. 주로 성능이 중요한 고급 시나리오에서 사용되며, GC(가비지 컬렉션) 오버헤드를 줄이는 데 매우 유리합니다. using System; class Program { static void Main() { int[] numbers = { 10, 20, 30, 40, 50 }; Span slice = new Span(numbers, 1, 3); for (int i = 0; i { slice[i] *= 2; } foreach (var n in numbers) .. 2025. 7. 11. ?? 널 병합 연산자 (Null-coalescing Operator) ?? 널 병합 연산자 (Null-coalescing Operator) 널 병합 연산자 ??는 왼쪽 피연산자가 null이 아닐 경우 그 값을 반환하고, null이면 오른쪽 피연산자를 반환합니다. 변수에 기본값을 설정하거나, 널 가능 변수를 안전하게 사용할 때 매우 유용합니다. using System; class Program { static void Main() { string? userInput = null; string result = userInput ?? "기본값"; Console.WriteLine(result); } } userInput이 null이므로 "기본값"이 출력됩니다. 이 문법은 조건문보다 간결하고 가독성이 좋으며, 특.. 2025. 6. 30. 이전 1 2 3 다음