dotNET29 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. 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. required 멤버로 안전하고 명확한 객체 초기화하기 required 멤버로 안전하고 명확한 객체 초기화하기 required 키워드는 클래스나 구조체의 특정 속성이 반드시 초기화되어야 함을 강제합니다. 이는 컴파일 타임에서 누락된 필드를 감지하여 런타임 NullReferenceException을 예방합니다. DTO, 설정 객체, 데이터 전달용 클래스 등에서 데이터 불완전성을 막는 데 유용합니다. 기존의 생성자 강제 방식보다 유연하며, 객체 이니셜라이저(Object Initializer) 와 함께 안전하게 사용됩니다. public class User { public required string Name { get; set; } public required string Email { get; set; } } // 모든 required 속성.. 2025. 10. 29. 문자열 보간기(Interpolated String Handler)로 포매팅 성능 최적화하기 문자열 보간기(Interpolated String Handler)로 포매팅 성능 최적화하기 C# 10부터 Interpolated String Handler 기능이 도입되어, 문자열 보간($"...")을 사용할 때 불필요한 문자열 생성 및 메모리 할당을 최소화할 수 있습니다. 기존의 string.Format()이나 단순 보간식은 모든 문자열을 미리 결합하기 때문에 성능이 저하될 수 있었지만, 이 기능은 필요할 때만 문자열을 생성하여 메모리 효율과 속도를 동시에 확보합니다. 특히 로깅, 디버깅, 조건부 문자열 구성 시 불필요한 연산을 방지하여 CPU 사용량과 GC 부담을 줄이는 데 효과적입니다. Before (일반 문자열 보간) using System; class Program { static.. 2025. 10. 28. record struct로 불변 값 타입(Value Type) 안전하게 설계하기 record struct로 불변 값 타입(Value Type) 안전하게 설계하기record struct는 **값 타입(value type)**으로 작동하는 불변(immutable) 데이터 컨테이너입니다. 일반 struct는 복사 기반이라 값 변경 시 버그가 발생하기 쉽지만, record struct는 불변 + 비교 연산 최적화를 제공합니다. 주로 좌표, 설정, 파라미터, DTO 등 변경이 불필요한 데이터에 적합합니다. record class와 달리 힙 할당이 아닌 스택 기반이라 GC 부담이 적습니다. using System; public readonly record struct Point(int X, int Y) { public double Distance => Math.Sqrt(X * X +.. 2025. 10. 22. 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. 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. HashSet<T>와 Dictionary<TKey,TValue>로 빠른 조회 성능 확보하기 HashSet와 Dictionary로 빠른 조회 성능 확보하기 List는 선형 검색 → 평균 O(n) 성능. 데이터가 많아지면 성능 저하 심각. Dictionary와 HashSet는 해시 기반 → 평균 조회/삽입/삭제가 O(1) 수준. HashSet: 값의 존재 여부를 빠르게 판단할 때 적합. Dictionary: 키-값 매핑에 최적화. 주의: 해시 충돌과 메모리 사용량 증가 가능 → 고유성 검사/대량 데이터 처리에 이점이 크다. using System; using System.Collections.Generic; using System.Diagnostics; class Program { static void Main() { const int N = 1_000_000; .. 2025. 10. 2. 전역 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. 효율적인 예외 처리와 ThrowHelper 패턴 효율적인 예외 처리와 ThrowHelper 패턴예외(Exception)는 흐름 제어용이 아님 → 정상 로직에서 자주 발생하면 성능 저하. try/catch 블록 안에서 코드를 실행하는 것 자체는 비용이 적지만, 실제 예외 발생 시 스택 추적 생성 때문에 비용이 큼. .NET 런타임/라이브러리는 ThrowHelper라는 패턴을 사용해 공용 메서드에서 예외 객체 생성·throw를 분리하여 JIT 최적화와 코드 크기 감소를 유도. 비동기 메서드(async/await)의 예외는 자동으로 Task.Exception에 담김 → 반드시 await해야 예외 전파됨. using System; class ThrowHelper { public static void ThrowIfNull(object? obj, s.. 2025. 9. 30. 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. 델리게이트와 이벤트를 활용한 느슨한 결합 구현 델리게이트와 이벤트를 활용한 느슨한 결합 구현델리게이트는 메서드 시그니처를 나타내는 타입으로, 함수를 변수처럼 다루며 이벤트는 델리게이트를 기반으로 한 발행-구독 패턴입니다. 목적은 클래스 간 결합도를 낮추고, 확장성을 높이는 것입니다. 이벤트 핸들러를 등록하여 변경 사항을 알릴 때 유용합니다. using System; public class Publisher { // 델리게이트 정의 public delegate void NotificationHandler(string message); // 이벤트 선언 public event NotificationHandler OnNotification; public void Notify(string message) { .. 2025. 9. 11. 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. 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. 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. 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. 이전 1 2 다음