CSharp/CShap Tip67 Memory<T>와 IMemoryOwner<T>로 고성능 버퍼 관리하기 Memory와 IMemoryOwner로 고성능 버퍼 관리하기 Memory와 IMemoryOwner는 배열을 안전하게 여러 곳에 공유하거나 슬라이스하며, 풀링(Buffer Pool)을 통해 대량 데이터를 고성능·저비용으로 처리할 수 있게 해주는 고급 메모리 관리 도구입니다. using System; using System.Buffers; // ArrayPool, IMemoryOwner 지원 class Program { static void Main() { // 1) 메모리 풀에서 버퍼 대여 IMemoryOwner owner = MemoryPool.Shared.Rent(16); // 2) Memory로 버퍼 구역 표현 Memory .. 2025. 11. 24. List의 Find·FindAll로 원하는 데이터 빠르게 찾기 List의 Find·FindAll로 원하는 데이터 빠르게 찾기 Find와 FindAll은 리스트에서 조건에 맞는 단일 요소 또는 모든 요소를 간편하고 빠르게 검색할 수 있게 해주는 메서드로, 조건 탐색을 반복문보다 더 직관적이고 안전하게 구현할 수 있습니다. using System; using System.Collections.Generic; class Program { static void Main() { var names = new List { "Alex", "Brian", "Alice", "Bella", "David" }; // 1) Find: 조건에 맞는 "첫 번째" 요소 반환 string firstA = names.Find(name.. 2025. 11. 21. 구조적 로깅(Structured Logging)과 ILogger<T> 활용하기 구조적 로깅(Structured Logging)과 ILogger 활용하기 구조적 로깅은 단순 문자열 로그가 아니라 이름 있는 필드와 값을 함께 기록해 머신 분석 가능한 형태로 데이터를 남기는 방식으로, 대규모 서비스의 성능 모니터링·문제 추적·관찰성 향상에 필수적인 기술입니다. using System; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; class Program { static void Main() { // DI 컨테이너 구성 및 로거 설정 var services = new ServiceCollection() .AddLo.. 2025. 11. 19. ValueTuple로 여러 값을 간단하고 효율적으로 반환하기 ValueTuple로 여러 값을 간단하고 효율적으로 반환하기 ValueTuple은 함수에서 여러 값을 하나의 구조로 묶어 반환하기 위한 경량 구조체입니다. 클래스를 생성하거나 별도 DTO를 만들 필요 없이 가독성 좋은 이름 기반 반환값을 구성할 수 있습니다. 구조체(Value Type)이므로 참조 할당 비용이 없고 가벼움. Deconstruct(분해) 문법을 자연스럽게 지원해 사용성이 뛰어납니다. public static (int sum, double average) CalculateStats(int[] numbers) { int sum = numbers.Sum(); double avg = numbers.Average(); return (sum, avg); } // 사용 예시 v.. 2025. 11. 17. pattern matching으로 조건문을 더 간결하고 직관적으로 표현하기 pattern matching으로 조건문을 더 간결하고 직관적으로 표현하기 C#의 Pattern Matching(패턴 매칭) 은 is, switch, when 구문을 활용하여 값과 타입을 동시에 비교하는 기능입니다. 기존의 다중 if-else 문을 대체해 코드 가독성과 유지보수성을 높이며, 타입 검사와 조건 검사를 하나로 통합할 수 있습니다. C# 9 이후에는 논리 패턴, 관계 패턴, 조합 패턴까지 지원되어 훨씬 강력해졌습니다. string GetAccessLevel(object user) => user switch { Admin a when a.Level > 5 => "최고 관리자", Admin => "일반 관리자", Guest => "게스트 사용자", null => .. 2025. 11. 12. async streams로 비동기 데이터 스트림을 효율적으로 처리하기 async streams로 비동기 데이터 스트림을 효율적으로 처리하기 async streams는 IAsyncEnumerable 기반으로 비동기적으로 데이터를 순차적으로 생산·소비할 수 있는 기능입니다. 기존에는 비동기 데이터를 배열·리스트에 모두 담은 뒤 한 번에 반환했지만, async stream은 데이터가 도착하는 즉시 순차적으로 처리할 수 있습니다. 네트워크 스트림, 파일 읽기, 대용량 데이터 처리 같은 상황에서 메모리 절약 + 반응성 향상이 가능합니다. Before — 전체 데이터를 로드 후 처리 (메모리 사용량 증가) public async Task> LoadDataAsync() { await Task.Delay(1000); return Enumerable.Range(1, .. 2025. 11. 10. Expression-bodied 멤버로 코드 간결하게 작성하기 Expression-bodied 멤버로 코드 간결하게 작성하기Expression-bodied 멤버는 메서드, 속성, 생성자 등을 한 줄 식으로 간결하게 표현할 수 있는 문법으로, 코드의 가독성과 유지보수성을 높여줍니다. using System; class Person { // 1️⃣ 필드 private string _name; // 2️⃣ 생성자 (Expression-bodied) public Person(string name) => _name = name; // 3️⃣ 속성 (Getter/Setter 간결화) public string Name { get => _name; // get 블록 축약 set => _.. 2025. 11. 7. string.Equals와 == 연산자의 차이 이해하기 string.Equals와 == 연산자의 차이 이해하기 C#에서 문자열 비교 시 == 연산자와 string.Equals()는 유사하지만, 비교 옵션(대소문자 구분, 문화권 설정 등) 에 따라 동작이 달라질 수 있어 올바른 비교 방식을 이해하는 것이 중요합니다. using System; using System.Globalization; class Program { static void Main() { string a = "Hello"; string b = "hello"; string c = "HELLO"; // 1️⃣ == 연산자 (기본: 대소문자 구분) Console.WriteLine(a == b); // False.. 2025. 11. 5. Parallel.For와 PLINQ로 멀티스레드 데이터 처리하기 Parallel.For와 PLINQ로 멀티스레드 데이터 처리하기Parallel.For와 PLINQ는 반복문이나 LINQ 쿼리를 여러 스레드에서 동시에 실행하여 CPU 사용률을 극대화하고 대용량 데이터를 빠르게 처리할 수 있게 해주는 병렬 처리 기술입니다. using System; using System.Diagnostics; using System.Linq; using Systehttp://m.Threading.Tasks;class Program { static void Main() { int[] numbers = Enumerable.Range(1, 10_000_000).ToArray(); Stopwatch sw = new Stopwatch(); .. 2025. 11. 4. ref struct로 스택 전용 구조체로 메모리 효율 극대화하기 ref struct로 스택 전용 구조체로 메모리 효율 극대화하기ref struct는 스택(stack) 에만 존재할 수 있는 구조체 타입으로, 힙 할당을 원천적으로 차단하여 메모리 효율과 성능 안정성을 높이는 기능입니다. 일반 struct는 복사 시 비용이 크거나 힙에 올려질 수 있지만, ref struct는 GC 영향이 전혀 없습니다. 대표적인 예로 Span와 ReadOnlySpan가 있습니다 — 모두 ref struct 기반으로 구현되어 있습니다. 민감한 데이터(예: 암호, 토큰)를 힙에 남기지 않기 때문에 보안성도 향상됩니다. ref struct StackBuffer { private Span _data; public StackBuffer(Span data) { .. 2025. 11. 3. 문자열 보간기(Interpolated String Handler)로 포매팅 성능 최적화하기 문자열 보간기(Interpolated String Handler)로 포매팅 성능 최적화하기 C# 10부터 Interpolated String Handler 기능이 도입되어, 문자열 보간($"...")을 사용할 때 불필요한 문자열 생성 및 메모리 할당을 최소화할 수 있습니다. 기존의 string.Format()이나 단순 보간식은 모든 문자열을 미리 결합하기 때문에 성능이 저하될 수 있었지만, 이 기능은 필요할 때만 문자열을 생성하여 메모리 효율과 속도를 동시에 확보합니다. 특히 로깅, 디버깅, 조건부 문자열 구성 시 불필요한 연산을 방지하여 CPU 사용량과 GC 부담을 줄이는 데 효과적입니다. Before (일반 문자열 보간) using System; class Program { static.. 2025. 10. 28. WeakReference로 캐시 객체의 수명 안전하게 관리하기 WeakReference로 캐시 객체의 수명 안전하게 관리하기 C#의 **WeakReference**는 GC(가비지 컬렉터)가 객체를 수거할 수 있도록 허용하면서, 동시에 그 객체에 약한 참조(Weak Reference) 를 유지할 수 있는 기능입니다. 일반 참조(strong reference)는 객체를 메모리에 계속 유지시키지만, 약한 참조는 메모리 압박이 생기면 GC가 수거 가능하게 만들어줍니다. 캐시 시스템, 이미지 뷰어, 또는 대량 객체를 임시로 유지해야 하는 시나리오에서 유용합니다. using System; class HeavyData { public int[] Data = new int[1_000_000]; } class Program { static void Main() .. 2025. 10. 20. 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. 이전 1 2 3 4 다음