C# Study/이펙티브 C# 맨텀 2021. 4. 27. 16:06
다음 본문은 도서 이펙티브 C# (빌 와그너)에서 나오는 주제를 다룹니다. 제네릭과 함께 여러개의 오버로드된 메서드가 있는경우 컴파일러가 어느 메서드를 우선 선택하는지를 알아둘 필요가 있다. 부모 형식 vs 제네릭 형식 우선순위 - Parent 클래스를 상속받는 DerivedA 클래스 객체가 있을 때, 매개변수 형식으로 Parent를 취하는 메서드와 제네릭 T를 취하는 메서드가 오버로딩 되어있다. 두 메서드 중 어느 것이 호출될까? public abstract class Parent { public double Mass { get; set; } public string Name { get; set; } } public class DerivedA : Parent{ } public class MyTest {..
C# Study/이펙티브 C# 맨텀 2021. 4. 27. 15:46
다음 본문은 도서 이펙티브 C# (빌 와그너)에서 나오는 주제를 다룹니다. C#에서 제약조건을 설정하는건 한계가 많은 것 처럼 보인다. 우선 제약 조건을 위해 인터페이스를 구현하는 방식을 생각해 볼 수 있다. Add() 메서드를 정의하기 위한 예시 - Add() 메서드를 정의하는 IAdd 인터페이스를 생성 - 이 인터페이스를 제약 조건으로 설정 - IAdd를 구현할 클래스를 생성 - IAdd가 정의한 Add()메서드를 구현 꽤 작업량이 많아지며, 클래스의 기본적인 구조를 해친다. 제약 조건으로 델리게이트 사용하기 제약조건으로 델리게이트를 작성하면 추가적인 작업없이 해결 가능하다. 특정 제네릭 클래스가 T타입의 두 객체를 더하는 메서드를 필요로 하는 경우 System.Func 델리게이트를 사용하면 필요한 ..
C# Study/이펙티브 C# 맨텀 2021. 4. 27. 15:16
다음 본문은 도서 이펙티브 C# (빌 와그너)에서 나오는 주제를 다룹니다. 타입의 가변성(variance), 즉 공변(convariance)과 반공변(contravariance)은 특정 타입의 객체를 다른 타입 객체로 변환할 수 있는 성격을 말한다. 공변과 반공변 - 타입 매개변수로 주어지는 타입이 상호 호환 가능할 경우 이를 이용하는 제네릭 타입도 호환 가능함을 추론하는 기능. - IEnumerable 를 매개변수로 취하는 메서드는 IEnumerable 객체도 받아들일 수 있어야 한다. - IEnumerable객체를 반환하는 메서드는 이 반환 객체를 IEnumerable 객체에 할당할 수 있어야 한다. 공변 (out) - X -> Y일 때, C를 C -> C인 경우 공변이다. - out 데코레이터를 사..
C# Study/이펙티브 C# 맨텀 2021. 4. 27. 14:11
다음 본문은 도서 이펙티브 C# (빌 와그너)에서 나오는 주제를 다룹니다. 제약조건은 타입 매개변수가 할 수 있는 것을 규정하지만, 무엇을 해서는 안 되는지는 규정하지 않는다. 제약조건이 요구하는 작업 외에는 신경을 쓰지 않는다는 것이다. 하지만 IDisposable을 구현하고 있다면 추가 작업이 필요하다. 메소드 내에서 타입 객체를 생성한 경우 - T가 IDisposable을 구현한 타입일경우 그냥 생성하고 사용하기만하면 리소스 누수가 발생할 수 있다. - T가 IDisposable을 구현했다면 using 블록이 끝날 때 Dispose()를 호출한다. public void GetThingsDone() { T driver = new T(); using(driver as IDisposable) { diri..
C# Study/이펙티브 C# 맨텀 2021. 4. 26. 22:21
다음 본문은 도서 이펙티브 C# (빌 와그너)에서 나오는 주제를 다룹니다. .NET Framework는 객체의 선후 관계를 판단할 수 있는 IComparable와 IComparer를 제공한다. 더불어 C#은 타입 내의 관계 연산자 (, =)를 재 정의하여 선후 관계를 판단할 수 있다. IComparable, IComparable - 하나의 메서드만 정의되어있다. - 객체가 대상 객체보다 작으면 0보다 작은 값을, 같으면 0, 크면 0보다 큰 값을 반환한다. public interface IComparable { int CompareTo(object obj); } IComparer, IComparer - 하나의 메서드만 정의되어있다. - x가 y보다 작다면 0보다 작은 값을, 같으면 0, 크면 0보다 큰 ..
C# Study/이펙티브 C# 맨텀 2021. 4. 26. 21:45
다음 본문은 도서 이펙티브 C# (빌 와그너)에서 나오는 주제를 다룹니다. 제네릭을 사용한다면 공용 메서드를 작성할 수 있기 때문에 코드의 양이 줄어들게 된다. 하지만 공용으로 처리되기 때문에 특정 타입에 더 효율적으로 작동하는 알고리즘이 존재한다면, 특정 타입을 위한 구현을 별도로 작성하는 것이 성능에 이점을 줄 수 있다. 예시 : IEnumerable와 IList IEnumerable를 사용하는 메소드를 만들고 있다고 가정하자. 특정 메소드에서 IList 타입 객체를 사용하면 랜덤엑세스를 사용할 수 있게되어 코드가 단축될 수 있다. (List인터페이스는 IEnumerable의 하위 인터페이스이다.) 그런데 제네릭의 인스턴스는 런타임의 타입을 고려하지 않으며, 컴파일타임 타입만을 고려한다. IList ..