CSharp107 Dictionary에서 값으로 키 찾기 Dictionary에서 값으로 키 찾기C#의 Dictionary는 키를 통해 값을 찾는 데 최적화되어 있습니다. 하지만 특정 값을 기준으로 키를 찾아야 할 때가 있습니다. 이 경우 LINQ를 사용하면 깔끔하게 해결할 수 있습니다. using System; using System.Collections.Generic; using System.Linq; class Program { static void Main() { var fruits = new Dictionary() { {"A", "Apple"}, {"B", "Banana"}, {"C", "Cherry"}, {"D", "Duri.. 2025. 8. 13. 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. Enumerable.Range()와 Select()를 활용해 숫자 리스트와 계산 결과 만들기 Enumerable.Range()와 Select()를 활용해 숫자 리스트와 계산 결과 만들기 Enumerable.Range(start, count) 메서드를 사용하면 정수 시퀀스를 쉽고 깔끔하게 생성할 수 있습니다. 여기에 Select()를 결합하면 간단한 수열 연산도 한 줄로 처리할 수 있어 매우 유용합니다. using System; using System.Linq; class Program { static void Main() { var squares = Enumerable.Range(1, 5) .Select(n => n * n); Console.WriteLine("1부터 5까지의 제곱수:"); .. 2025. 8. 7. using var 선언으로 자원을 자동 해제하는 간결한 패턴 using var 선언으로 자원을 자동 해제하는 간결한 패턴 C# 8.0 이상에서는 using 블록 대신 using var 선언만으로도 IDisposable 객체의 리소스를 자동 해제할 수 있습니다. 코드가 더 깔끔해지고 들여쓰기 깊이도 줄여 유지보수성을 높일 수 있는 실무 팁입니다. using System; using System.IO; using Systehttp://m.Threading.Tasks;class Program { static async Task Main() { using var client = new Systehttp://m.Net.Http.HttpClient(); Console.WriteLine("웹 요청 중..."); str.. 2025. 8. 6. ??= Null 병합 할당 연산자 활용하기 ??= Null 병합 할당 연산자 활용하기 C# 8.0에서 도입된 ??= 연산자는 왼쪽 피연산자가 null일 경우에만 오른쪽 값을 할당합니다. 이 연산자는 객체 초기화나 기본값 설정에 자주 사용됩니다. List? names = null; // ??=를 사용하여 null일 경우에만 새 리스트를 할당 names ??= new List(); names.Add("김원호"); Console.WriteLine(string.Join(", ", names)); 코드 간결화: if 문 없이도 기본값 설정 가능 가독성 향상: null 체크와 할당을 한 줄에 처리 NRE(NullReferenceException) 방지에 유용 서비스 클래스에서 DI 주입되지 않은 인스턴스에 기본 구현 제공 시 ViewModel에서 nul.. 2025. 8. 5. string.Join()으로 문자열 배열 간단하게 결합하기 string.Join()으로 문자열 배열 간단하게 결합하기문자열 배열이나 리스트를 하나의 문자열로 합치려면 string.Join() 메서드가 가장 간편하고 안전한 방법입니다. 반복문 없이도 한 줄로 처리할 수 있어 코드가 깔끔해집니다. using System; class Program { static void Main() { string[] fruits = { "사과", "바나나", "포도" }; string result = string.Join(", ", fruits); Console.WriteLine("과일 목록: " + result); } } 출력 결과 과일 목록: 사과, 바나나, 포도 string.Join(separator, ar.. 2025. 8. 4. record 타입으로 불변 객체 선언하기 record 타입으로 불변 객체 선언하기 record는 C# 9.0 이상에서 도입된 참조형 타입으로, 기본적으로 불변성을 유지하면서 값 기반 비교를 지원합니다. 객체를 불변으로 유지하면서도 편리하게 사용할 수 있어, DTO, 설정 객체 등에 적합합니다. public record User(string Name, int Age); class Program { static void Main() { var user1 = new User("Kim", 30); var user2 = user1 with { Age = 31 }; Console.WriteLine(user1); // User { Name = Kim, Age = 30 } Conso.. 2025. 8. 1. 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. switch 표현식으로 깔끔한 조건 분기 처리 switch 표현식으로 깔끔한 조건 분기 처리 C# 8.0부터 도입된 switch 표현식은 기존 switch 문보다 더 간결하고 안전한 방식으로 조건 분기를 처리할 수 있게 해줍니다. 특히 enum, 튜플, 패턴 매칭 등과 함께 사용하면 코드의 가독성과 유지보수성이 크게 향상됩니다. enum UserRole { Admin, Manager, Guest } class Program { static void Main() { var role = UserRole.Manager; string access = role switch { UserRole.Admin => "모든 권한 허용", UserRole.Man.. 2025. 7. 25. int.TryParse()로 안전한 숫자 변환 처리 int.TryParse()로 안전한 숫자 변환 처리사용자 입력이나 외부 데이터에서 숫자 문자열을 변환할 때, int.Parse() 사용은 예외 발생 위험이 있습니다. 이럴 땐 int.TryParse()를 사용하면 예외 없이 안전하게 변환 여부를 체크할 수 있어 더 안정적입니다. using System; class Program { static void Main() { Console.Write("숫자를 입력하세요: "); string input = Console.ReadLine() ?? ""; if (int.TryParse(input, out int value)) Console.WriteLine($"변환 성공: {value.. 2025. 7. 22. Null 병합 연산자(??)로 안전하고 간결한 기본값 처리하기 Null 병합 연산자(??)로 안전하고 간결한 기본값 처리하기 ?? 연산자는 왼쪽 피연산자가 null일 경우 오른쪽 값을 반환하는 C#의 간단하고 강력한 기능입니다. 초보자에게 매우 유용하며, 코드의 가독성과 안정성을 동시에 높일 수 있습니다. using System; class Program { static void Main() { string? name = null; // Null 병합 연산자를 사용해 기본값 설정 string result = name ?? "기본값"; Console.WriteLine(result); } } name이 null이면 "기본값"을 반환합니다. 주로 설정값, 사용자 입력값, API 응답 처리.. 2025. 7. 21. Span<T>를 활용한 고성능 문자열 처리 Span를 활용한 고성능 문자열 처리 Span는 메모리 할당 없이 배열, 문자열, 버퍼 등의 슬라이스를 다룰 수 있게 해주는 고급 기능입니다. 특히 문자열 처리, 파싱, 버퍼 조작 등에서 성능을 극대화할 수 있습니다. 단, Span는 스택 메모리에서 동작하므로 힙에 저장할 수 없고 async 메서드에서 사용할 수 없습니다. using System; class Program { static void Main() { string csv = "apple,banana,cherry"; ReadOnlySpan span = csv.AsSpan(); int index = span.IndexOf(','); ReadOnlySpan firstIt.. 2025. 7. 18. 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. async Task Main()으로 콘솔 비동기 코딩 깔끔하게! async Task Main()으로 콘솔 비동기 코딩 깔끔하게! C# 7.1 이후부터는 Main 메서드도 async Task로 선언할 수 있어, 콘솔 앱에서 비동기 코드를 자연스럽게 사용할 수 있습니다. 이전에는 GetAwaiter().GetResult() 같은 번거로운 방식이 필요했지만, 이제는 await를 바로 사용할 수 있어 가독성과 안정성이 향상됩니다. using System; using Systehttp://m.Net.Http;using Systehttp://m.Threading.Tasks;class Program { static async Task Main() { using var client = new HttpClient(); Console.Wr.. 2025. 7. 16. ?? 널 병합 연산자 활용하기 ?? 널 병합 연산자 활용하기 널 병합 연산자 ??는 왼쪽 피연산자가 null이 아니면 그 값을, null이면 오른쪽 값을 반환합니다. 기본값 설정이나 널 가능(reference) 타입을 다룰 때 코드가 한결 깔끔해지고 안전해집니다. using System; class Program { static void Main() { string? userInput = null; // userInput이 null일 경우 "기본값"을 대입 string result = userInput ?? "기본값"; Console.WriteLine(result); // 기존 변수에 직접 null 병합 할당 userInput ??.. 2025. 7. 14. 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. LINQ의 GroupBy로 데이터 그룹화 쉽게 하기 LINQ의 GroupBy로 데이터 그룹화 쉽게 하기 C#의 LINQ를 사용하면 리스트나 컬렉션을 조건에 따라 그룹화할 수 있습니다. GroupBy() 메서드는 데이터를 특정 키로 그룹화하여 카테고리별로 분류하거나 통계를 낼 때 매우 유용합니다. using System; using System.Collections.Generic; using System.Linq; class Program { class Product { public string Category { get; set; } public string Name { get; set; } } static void Main() { List products = new Li.. 2025. 7. 9. string.IsNullOrWhiteSpace()로 문자열 검증을 더 견고하게! string.IsNullOrWhiteSpace()로 문자열 검증을 더 견고하게!string.IsNullOrWhiteSpace()는 문자열이 null, 빈 문자열(""), 또는 공백 문자(스페이스, 탭 등)만으로 구성된 경우 true를 반환합니다. 사용자 입력 검증이나 API 데이터 처리 시 안전하고 간편하게 조건을 검사할 수 있는 유용한 메서드입니다. using System; class Program { static void Main() { string input1 = null; string input2 = ""; string input3 = " "; string input4 = "Hello"; Console... 2025. 7. 8. 이전 1 2 3 4 ··· 6 다음