C# Study/이펙티브 C# 맨텀 2021. 4. 28. 18:09
다음 본문은 도서 이펙티브 C# (빌 와그너)에서 나오는 주제를 다룹니다. 일상적인 개발에서 반복구문을 사용하여 개발하는 것은 대부분의 경우 문제는 없다. 하지만 쿼리구문을 사용한다면 몇 가지 이점을 가져올 수 있다. 1. 프로그램의 논리를 명령형 방식에서 선언적인 방식으로 전환할 수 있다. 2. 질의의 내용을 구성할 수 있을 뿐 아니라 개별 항목에 대해 수행하려는 작업의 수행 시기를 연기할 수 있다. 3. 사용자의 의도를 더 명확하게 드려낼 수 있다. 명령형 방식으로 구현한 예 var foo = new int[100]; for(var num = 0; num < foo.Length; num++) foo[num] = num * num; foreach(int i in foo) Console.WriteLine..
C# Study/이펙티브 C# 맨텀 2021. 4. 28. 17:07
다음 본문은 도서 이펙티브 C# (빌 와그너)에서 나오는 주제를 다룹니다. 메서드에서 단일의 객체를 반환하기 보다 시퀀스를 반환하는 일이 종종 있다. 이 때 컬렉션을 반환하기 보다 이터레이터를 반환하는 것이 좋다. 중요한 점은 이터레이터는 실제 시퀀스가 아니라, 시퀀스를 생성하는 방법을 알고 있는 객체를 생성한다는 것이다. 다음의 코드는 int 타입으로 표현가능한 양의 정수의 시퀀스를 생성한다. var allNumbers = Enumerable.Range(0, int.MaxValue); 이 시점에서는 실제로 시퀀스가 생성된 것이 아니다! 때문에 일부만 꺼내 사용한다면 방대한 크기의 시퀀스를 저장할 메모리가 필요치 않다. 사용자의 선택으로 넘기자 IEnumerable를 반환한다면 필요할 때마다 하나씩 항목..
C# Study/이펙티브 C# 맨텀 2021. 4. 28. 16:30
다음 본문은 도서 이펙티브 C# (빌 와그너)에서 나오는 주제를 다룹니다. 제네릭 컬렉션에서 타입을 구체화하는 경우 해당 타입의 기능들을 활용할 수 있다. 예를들어 IEnumerable, IEnumerable, IEnumerable 등으로 타입 매개변수가 숫자인 경우에만 사용할 수 있는 확장 메서드들이 존재한다. 다음은 IEnumerable에 특화된 확장 메서드 들 중 일부이다. public static class Enumerable { public static int Average(this IEnumerable squence); public static int Max(this IEnumerable sequence); public static int Min(this IEnumerable sequence)..
C# Study/이펙티브 C# 맨텀 2021. 4. 28. 15:54
다음 본문은 도서 이펙티브 C# (빌 와그너)에서 나오는 주제를 다룹니다. 확장 메서드를 이용하면 인터페이스의 기능을 손쉽게 확장할 수 있다. System.Linq.Enumerable 클래스가 대표적인 예다. IEnumerable는 기본적인 구현만 가지고 있으며, Where, OrderBy, ThenBy, GroupInfo 등은 확장 메서드로 구현되어있다. 확장의 예시 - IComparable의 경우 left.CompareTo(right) 와 같은 형태로 사용하며 리턴되는 값이 left가 right보다 작은 경우 0보다 작은 값을 반환한다. - 이 경우 익숙하지않은 개발자에게는 혼란을 줄 여지가 있다. 아래와 같이 기존 메서드를 활용하여 확장 메서드로 재정의한다면 실수로 사용하는 일은 줄어들게 될 것이다..
C# Study/이펙티브 C# 맨텀 2021. 4. 28. 15:27
다음 본문은 도서 이펙티브 C# (빌 와그너)에서 나오는 주제를 다룹니다. 제네릭만 사용한다면 좋겠지만 제네릭이 없었던 시절에 개발된 코드들을 지원해야 하는 경우도 생길 것이다. 때문에 라이브러리 개발 시 제네릭뿐만 아니라 논제네릭도 같이 구현한다면 라이브러리 활용도를 좀 더 높일 수 있다. 논제네릭을 명시적으로 구현하기 인터페이스 구현 시 메서드 앞에 인터페이스의 이름을 붙여서 명시적으로 구현하는 방법과, 명시없이 public 한정자로 암묵적으로 구현하는 방법이 존재한다. 명시적으로 구현된 인터페이스 메서드는 해당 인터페이스의 참조를 통해서만 호출할 수 있다. 논제네릭을 명시적으로 구현한다면 암시적으로 구현된 제네릭 메서드가 우선적으로 선택되기 때문에 실수로 논제네릭을 사용하는 일을 방지할 수 있다. ..
C# Study/이펙티브 C# 맨텀 2021. 4. 27. 16:29
다음 본문은 도서 이펙티브 C# (빌 와그너)에서 나오는 주제를 다룹니다. 무작정 제네릭 클래스를 만드는 것보다는 일반 클래스 내의 제네릭 메서드를 작성하는 편이 훨씬 좋은 경우가 있다. 제네릭 클래스는 클래스 전체를 하나의 제약조건으로 감싸게 되지만 일반 클래스 내의 제네릭 메서드는 각 메서드마다 개별적인 제약 조건을 설정할 수 있다. 제네릭 클래스 내의 유틸 함수 - 사용할때 를 매번 명시해야되는 귀찮음이 있다. public class MyTest { public void MyMethod() { int a = 0; int b = 2; var result = Utils.Max(a, b); } } public static class Utils { public static T Max(T left, T ri..