CSharp/CShap Tip46 익명 메서드와 람다식(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. Span<T>와 Memory<T>를 사용한 고성능 메모리 처리 Span와 Memory를 사용한 고성능 메모리 처리 C#에서는 고성능 애플리케이션을 위해 Span와 Memory를 활용해 할당 없는 슬라이싱(Slicing) 과 데이터 복사 최소화를 할 수 있습니다. 특히, 문자열이나 배열 등의 데이터를 부분적으로 다룰 때 유용하며, GC 부담도 줄일 수 있습니다. using System; class Program { static void Main() { string text = "CSharpPerformanceTip"; ReadOnlySpan span = text.AsSpan(6, 11); Console.WriteLine(span.ToString()); // "Performance" } } 출력 .. 2025. 6. 27. yield return을 활용한 지연 평가(Deferred Execution) yield return을 활용한 지연 평가(Deferred Execution) yield return을 사용하면 이터레이터(Iterator)를 쉽게 구현할 수 있고, 데이터를 한 번에 모두 로드하지 않고 필요할 때마다 반환하여 메모리를 효율적으로 사용할 수 있습니다. 이 기능은 데이터 스트리밍 처리, 필터링, 성능 개선 등에 매우 유용합니다. using System; using System.Collections.Generic; class Program { static void Main() { foreach (int square in GetSquares(5)) { Console.WriteLine(square); } .. 2025. 6. 26. LINQ의 SelectMany로 중첩 컬렉션을 평면화하기 LINQ의 SelectMany로 중첩 컬렉션을 평면화하기SelectMany는 컬렉션 안의 컬렉션(예: List> 또는 List with List property)을 하나의 평면적인 시퀀스로 펼칠 때 유용합니다. 복잡한 데이터 구조에서 원하는 항목을 효율적으로 추출할 수 있게 도와줍니다. using System; using System.Collections.Generic; using System.Linq; class Student { public string Name { get; set; } public List Subjects { get; set; } } class Program { static void Main() { List students = new .. 2025. 6. 25. 인터페이스 default 구현으로 공통 로직 제공하기 인터페이스 default 구현으로 공통 로직 제공하기 C# 8.0부터 인터페이스에 기본 구현을 추가할 수 있습니다. 이 기능은 공통 동작을 기본 구현으로 제공하면서도 필요한 클래스만 오버라이딩하여 재정의할 수 있게 합니다. 추상 클래스의 기능과 유사하지만 다중 상속이 안 되는 C#에서 인터페이스 유연성을 확장해주는 중요한 기능입니다. using System; public interface IGreeter { void SayHello(); void SayGoodbye() { Console.WriteLine("Goodbye from interface!"); } } public class KoreanGreeter : IGreeter { public voi.. 2025. 6. 20. DateTime.TryParse()로 날짜 문자열 안전하게 변환하기 DateTime.TryParse()로 날짜 문자열 안전하게 변환하기 사용자 입력이나 외부 데이터에서 날짜를 받을 때, DateTime.Parse()는 예외를 발생시킬 수 있습니다. 이럴 땐 DateTime.TryParse()를 사용하면 예외 없이 날짜 유효성을 검사하고 안전하게 변환할 수 있어요. using System; class Program { static void Main() { Console.Write("날짜를 입력하세요 (예: 2025-06-17): "); string input = Console.ReadLine(); if (DateTime.TryParse(input, out DateTime date)) { .. 2025. 6. 17. Span<T>와 stackalloc으로 고성능 메모리 처리하기 Span와 stackalloc으로 고성능 메모리 처리하기 Span는 메모리 할당 없이 배열처럼 다룰 수 있는 구조체이며, stackalloc과 함께 사용하면 GC 힙을 사용하지 않아 매우 빠른 속도로 일시적인 데이터를 처리할 수 있습니다. 고성능 처리가 필요한 경우 유용하며, 특히 문자열 처리나 바이트 버퍼 계산 등에 적합합니다. using System; class Program { static void Main() { Span numbers = stackalloc int[5] { 1, 2, 3, 4, 5 }; int sum = 0; foreach (var n in numbers) { sum += n; .. 2025. 6. 13. Where()와 Select() 조합으로 조건 필터 + 변환 처리하기 Where()와 Select() 조합으로 조건 필터 + 변환 처리하기 LINQ의 Where()는 조건으로 요소를 필터링하고, Select()는 이후 요소를 원하는 형태로 변환할 수 있어 한 줄로 필터링과 가공을 함께 처리할 수 있습니다. 코드 흐름도 간결하고 성능에도 이점이 있습니다. using System; using System.Collections.Generic; using System.Linq; class Program { static void Main() { var items = new List { 1, 2, 3, 4, 5, 6 }; var evensSquared = items .Where(n => n % 2 == 0) /.. 2025. 6. 12. List<T>.Contains()로 값 존재 여부 간단하게 확인하기 List.Contains()로 값 존재 여부 간단하게 확인하기컬렉션에 특정 값이 포함되어 있는지 확인하고 싶을 때는 List.Contains() 메서드를 사용하세요. 루프를 돌지 않아도 간단하고 직관적으로 포함 여부를 검사할 수 있습니다. using System; using System.Collections.Generic; class Program { static void Main() { List colors = new List { "Red", "Green", "Blue" }; if (colors.Contains("Green")) { Console.WriteLine("Green은 목록에 포함되어 있습니다."); .. 2025. 6. 10. Expression Tree로 동적 코드 생성하기 Expression Tree로 동적 코드 생성하기 Expression Tree는 코드 구조 자체를 데이터로 표현하고 런타임에 동적으로 조작하거나 실행할 수 있는 강력한 기능입니다. LINQ Provider 개발, 동적 쿼리, DSL 구현 등에 사용됩니다. using System; using System.Linq.Expressions; class Program { static void Main() { // x => x * x 형태의 식 만들기 ParameterExpression param = Expression.Parameter(typeof(int), "x"); Expression body = Expression.Multiply(param, par.. 2025. 6. 6. 이전 1 2 3 다음