CSharp/CShap Tip42 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. StringBuilder로 효율적인 문자열 결합 처리하기 StringBuilder로 효율적인 문자열 결합 처리하기C#에서 문자열을 반복해서 더하는 경우 + 연산자를 사용할 수도 있지만, 문자열이 많아질수록 성능 저하가 발생할 수 있습니다. StringBuilder는 내부 버퍼를 이용해 문자열을 연결하므로 훨씬 빠르고 효율적인 방식입니다. using System; using System.Text; class Program { static void Main() { StringBuilder sb = new StringBuilder(); for (int i = 1; i { sb.AppendLine($"[{i}] 안녕하세요!"); } Console.Write.. 2025. 6. 4. string.Split()으로 문자열을 손쉽게 나누기 string.Split()으로 문자열을 손쉽게 나누기string.Split() 메서드는 하나의 문자열을 구분자를 기준으로 나누어 배열로 반환하는 기능입니다. CSV 처리, 사용자 입력 파싱, 설정 파일 해석 등 다양한 곳에서 활용됩니다. using System; class Program { static void Main() { string colors = "빨강,파랑,초록"; string[] parts = colors.Split(','); Console.WriteLine("색상 목록:"); foreach (var color in parts) { Console.WriteLine($"- {color.. 2025. 5. 26. Expression Tree를 활용한 동적 코드 구성 Expression Tree를 활용한 동적 코드 구성 C#의 System.Linq.Expressions 네임스페이스를 이용하면 코드를 데이터처럼 구성할 수 있습니다. 컴파일 시점이 아닌 실행 시점에 식(함수, 연산)을 생성하고 조합할 수 있어 ORM, 규칙 엔진, 동적 쿼리 작성 등 고급 시나리오에 적합합니다. using System; using System.Linq.Expressions; class Program { static void Main() { // Expression: (int x) => x + 1 ParameterExpression param = Expression.Parameter(typeof(int), "x"); Express.. 2025. 5. 9. using 블록 없이 using 선언으로 자원 자동 해제하기 using 블록 없이 using 선언으로 자원 자동 해제하기 C# 8.0부터 도입된 using 선언은 블록을 사용하지 않아도 IDisposable 객체를 자동으로 정리해 줍니다. 코드를 간결하게 만들면서도 리소스 누수를 방지할 수 있는 유용한 기능입니다. using System; using System.IO; class Program { static void Main() { using var writer = new StreamWriter("log.txt"); writer.WriteLine("이 내용은 파일에 기록됩니다."); Console.WriteLine("파일 작성 완료!"); } } using var 선언은 해당 범위(scope)가 .. 2025. 5. 8. 이전 1 2 3 다음