CSharp/CSharp 문법72 델리게이트와 이벤트를 활용한 느슨한 결합 구현 델리게이트와 이벤트를 활용한 느슨한 결합 구현델리게이트는 메서드 시그니처를 나타내는 타입으로, 함수를 변수처럼 다루며 이벤트는 델리게이트를 기반으로 한 발행-구독 패턴입니다. 목적은 클래스 간 결합도를 낮추고, 확장성을 높이는 것입니다. 이벤트 핸들러를 등록하여 변경 사항을 알릴 때 유용합니다. using System; public class Publisher { // 델리게이트 정의 public delegate void NotificationHandler(string message); // 이벤트 선언 public event NotificationHandler OnNotification; public void Notify(string message) { .. 2025. 9. 11. default 리터럴로 간결한 초기화 default 리터럴로 간결한 초기화C# 7.1부터 default 리터럴을 사용하면 값 타입이나 제네릭 타입을 간단히 초기화할 수 있습니다. 이전에는 default(T)처럼 타입을 명시해야 했지만, 이제는 default만 써도 컴파일러가 타입을 추론하여 기본값(숫자는 0, bool은 false, 참조형은 null 등)을 지정합니다. using System; class Program { static void PrintDefault() { // 제네릭 타입에 대해 간결하게 기본값 할당 T value = default; Console.WriteLine($"Type: {typeof(T)}, Default: {value}"); } st.. 2025. 9. 9. 문자열 보간(String Interpolation) 문자열 보간(String Interpolation)C# 6.0부터는 **문자열 보간(String Interpolation)**을 사용할 수 있습니다. + 연산자나 string.Format() 대신 $ 기호를 사용하여 문자열 안에서 변수를 직접 삽입할 수 있습니다. 코드 가독성이 좋아지고 유지보수가 쉬워지는 장점이 있습니다. using System; class Program { static void Main() { string name = "Alice"; int age = 25; // 문자열 보간 사용 string message = $"이름: {name}, 나이: {age}"; Console.WriteLine(messa.. 2025. 9. 8. 확장 메서드(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. 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. 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. 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. 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. 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. 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. 이전 1 2 3 4 다음