본문 바로가기
반응형

책/Effective C#32

Effective C# - Item 25 타입 매개변수로 인스턴스 필드를 만들 필요가 없다면 제네릭 메서드를 정의하라 제네릭 클래스를 정의하면 클래스 전체에 대하여 제약 조건을 고려해야한다. 제약 조건의 적용 범위가 넓어지면 넓어질수록 코드를 수정하기가 까다로워진다. 그러므로 제네릭 클래스보다 제네릭 메서드를 사용하는 것이 낫다. 1. 제네릭 클래스를 사용하는 경우 public static class Utils { public static T Max(T left, T right) => Comparer.Default.Compare(left,right) Comparer.Default.Compare(left,right) > 0 > left : right; } 제네릭 클래스를 사용하는 경우 타입 매개변수를 명시적으로 지정.. 2023. 12. 18.
Effective C# - Item 24 베이스 클래스나 인터페이스에 대해서 제네릭을 특화하지말라 제네릭 클래스나 제네릭 메서드를 작성할 때는 사용자가 가능한 안전하고 혼랍스럽지 않도록 작성해야 한다. 특히 오버로드된 메서드가 여러 개인 경우 컴파일러가 이 중 하나를 어떻게 선택하는지 정확히 알고 있어야 한다. 그리고 사용자가 명시적으로 타입을 설정한 일반 메서드보다 제네릭 메서드가 우선적으로 선택되는 경우에 대해서도 명확히 이해하고 있어야 한다. public class MyBase { } public interface IMessageWriter { void WriteMessage(); } public class MyDerived : MyBase, IMessageWriter { void IMessageWriter.WriteMessage() => Conosle.WriteLine("Inside MyDer.. 2023. 12. 18.
Effective C# - Item23 타입 매개변수에 대해 메서드 제약 조건을 설정하려면 델리게이트를 활용하라 C#에서 제약 조건은 일정한 범위 내에서 사용 가능하며 기본적으로 클래스의 상속, 인터페이스 구현, 생성자 제약 등의 형태로 제한이 이루어진다. 몇 가지 경우에는 런타임에 제약 조건을 체크할 수 있는 기능이 제공되지 않기 때문에 컴파일 타임에만 확인할 수 있는 제약을 설정하는 것이 어려울 수 있다. 01 베이스 클래스의 타입이나 특정 인터페이스로 제약 조건 예를 들어, 특정 인터페이스를 구현하도록 하는 것은 가능하지만 인터페이스의 메서드 시그니처를 강제하거나 특정한 static 메서드를 반드시 구현하도록 하는 것은 어렵다. 02 class 타입이나 struct 타입으로 형태 제한 클래스 또는 구조체로 제한하는 것은 가능하지만 특정 메서드나 생성자의 존재를 강제하는 것은 기본 제약 조건에 포함되지 않다. .. 2023. 12. 15.
Effective C# - Item 22 공변성과 반공변성을 지원하라 타입의 가변성(Variance)은 특정 타입의 객체를 다른 타입의 객체로 변환할 수 있는 성격을 나타낸다. 이 가변성은 크게 공변성(Convariance)과 반공변성(Contravariance)으로 나눌 수 있다. 공변성 (Convariance) X를 Y로 바꾸어 사용할 수 있는 경우 C를 C로도 바꾸어 사용할 수 있다면 C는 공변이다. string[] str = new string[10]; object[] obj = str; 공변성은 배열과 같은 특정 컬렉션 형식에서 파생 타입을 기본 타입으로 사용하는 것을 허용한다 . 위의 예제처럼 string[]은 object[]의 파생타입이므로 string[]을 object[]로 할당할 수 있다. 반공변성(Contravariance) Y를 X로 바꾸어 사용할 수 .. 2023. 12. 14.
Effective C# - Item 21 타입 매개 변수가 IDisposable을 구현한 경우를 대비하여 제네릭 클래스를 작성하라 제약 조건은 두 가지 역할을 한다. 1. 런타임 오류가 발생할 가능성이 있는 부분을 컴파일 타임 오류로 대체 2. 타입 매개변수로 사용할 수 있는 타입을 명확히 규정하여 사용자에게 도움 제약 조건은 해당 타입이 특정 인터페이스를 구현하는 등의 특성을 지정할 수 있지만 해당 타입이 특정 작업을 수행하도록 강제하지는 않는다. 예를 들어 IDisposable을 구현하는 타입이라면 특별한 추가 작업이 필요하다고 설명했지만 제약 조건 자체는 해당 타입이 IDisposable을 구현하는지 여부만 확인할 뿐 실제로 IDisposable에서 요구하는 작업을 강제하지는 않는디. 제네릭 메서드 내에서 타입 매개 변수로 주어지는 타입을 이용하여 인스턴스를 생성하는 경우 발생 T가 IDisposable을 구현한 타입을 경우 .. 2023. 12. 10.
Effective C# - Item20 IComparable<T>와 IComparer<T>를 이용하여 객체의 선후 관계를 정의하라 객체의 값 비교(정렬 등)정의하는 인터페이스 두 가지 IComparable과 IComparer 1. IComparable 타입의 기본적인 선후 관계 정의 CompareTo(Object) public int CompareTo (object? obj); 매개변수 obj : 비교할 대상 객체 반환 음수 : 현재 객체가 대상 객체보다 작은 경우 0 : 현재 객체가 대상 객체와 같은 경우 양수 : 현재 객체가 대상 객체보다 큰 경우 01 (제네릭 버전) IComparable public class Piggy : IComparable { public string Name { get; set; } public int Age { get; set; } public int CompareTo(Piggy other) { re.. 2023. 12. 10.
반응형