CSharp114 확장 메서드(Extension Methods)로 클래스 기능 확장하기 확장 메서드(Extension Methods)로 클래스 기능 확장하기 C#에서는 **확장 메서드(Extension Method)**를 사용해 기존 클래스에 새로운 기능을 추가할 수 있습니다. 원본 코드를 수정하거나 상속하지 않고도, 정적 메서드를 인스턴스 메서드처럼 호출할 수 있다는 장점이 있습니다. using System; public static class StringExtensions { // 문자열의 첫 글자를 대문자로 변환하는 확장 메서드 public static string ToFirstUpper(this string str) { if (string.IsNullOrEmpty(str)) return str; return char.ToUpper.. 2025. 9. 4. Memory<T>와 Span<T>로 안전한 메모리 관리 Memory와 Span로 안전한 메모리 관리 Span와 Memory는 배열, 문자열, 네이티브 메모리 등 연속된 메모리를 안전하고 효율적으로 다룰 수 있도록 지원합니다. Span는 스택 기반에서 빠르게 동작하며, Memory는 힙에서도 사용할 수 있고 비동기 코드에서도 안전하게 전달할 수 있습니다. using System; class Program { static void Main() { int[] numbers = { 10, 20, 30, 40, 50 }; // 배열 일부를 Span으로 슬라이스 Span slice = numbers.AsSpan(1, 3); foreach (var n in slice) { .. 2025. 9. 3. ref readonly 반환으로 불필요한 복사 방지 ref readonly 반환으로 불필요한 복사 방지C# 7.2부터 ref readonly 반환을 사용하면 메서드가 값을 복사하지 않고 원본 데이터에 대한 읽기 전용 참조를 반환할 수 있습니다. 이 기능은 특히 구조체처럼 크기가 큰 값 타입을 다룰 때 성능 최적화에 효과적입니다. using System; struct BigStruct { public int A, B, C, D, E, F, G, H; } class DataContainer { private BigStruct[] data = new BigStruct[100]; public ref readonly BigStruct GetItem(int index) { return ref data[index]; //.. 2025. 9. 2. 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. async와 await로 비동기 프로그래밍 처리하기 async와 await로 비동기 프로그래밍 처리하기 C#의 async와 await 키워드는 비동기 프로그래밍을 단순화해줍니다. 복잡한 콜백 구조 없이도 직관적으로 비동기 작업을 작성할 수 있으며, 긴 실행 시간이 필요한 I/O 작업(파일 처리, DB 조회, API 호출 등)에서 UI 멈춤 현상을 방지하는 데 매우 효과적입니다. using System; using Systehttp://m.Net.Http;using Systehttp://m.Threading.Tasks;class Program { static async Task Main() { Console.WriteLine("데이터 요청 시작..."); string result = await GetDataA.. 2025. 8. 27. 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. 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. 이전 1 2 3 4 ··· 6 다음