C# 40

[Effective C#] 4장 LINQ 활용 (1)

아이템 29. 컬렉션을 반환하기보다 이터레이터를 반환하는 것이 낫다 이터레이터 메서드 - 호출자가 시퀀스를 만들어내기 위해 yield return 을 사용하는 것을 말한다. public static IEnumerable GenerateAlphabet() { var letter = 'a'; while(letter $"{target.LastName, 20}, {target.FirstName, 15}" } } // XmlExtensions.cs namespace XmlExtensions { public static class XmlReport { public static string Format(this Person target) => new XElement("Person", new XElement("Last..

C#/Advanced C# 2021.11.24

C# 공변성과 반공변성 Covariance / Contravariance

C#의 인터페이스와 대리자에 적용되는 제너릭 타입의 형변환에 관한 기준이다. Base 기반 클래스와 Derived 파생 클래스가 있다하자. public class Base {} public class Derived : Base {} Covariance 공변성 일반적인 다형성 참조 형식의 캐스팅에도 사용되는 방식으로 파생 타입의 인스턴스를 기반 타입으로 참조할 수 있다. IEnumerable d = new List(); IEnumerable b = d; Contravariance 반공변성 반대로 기반 타입 인스턴스를 파생 타입으로 참조한다. 일반적인 다형성 참조 형식에는 적용되지 않는다. 대리자의 제너릭 타입에만 적용된다. Action b = (target) => { Console.WriteLine(tar..

[Effective C#] 3장 제너릭 활용

C# 제너릭 타입 .NET 런타임이 제너릭 타입을 JIT 컴파일할 때 타입 매개변수에 값 타입이 지정되면 두 단계를 거친다. 1) 닫힌 제너릭 타입을 표현하기 위한 새로운 IL 클래스를 생성한다. T 인자가 구체 타입으로 대체된다. 2) 대체된 타입을 이용하여 실제 기계어 코드를 만들어낸다. 어셈블리가 로드되는 시점이 아니라 로드된 타입의 특정 메서드가 최초로 호출되는 시점에 호출 메서드에 대해서만 JIT 컴파일이 이루어지고 메서드 IL 코드가 기계어 코드로 대체된다. 아이템 18. 반드시 필요한 제약 조건만 설정하라. 제너릭 타입 T에 대한 조건을 설정하여 타입을 제한할 수 있다. 타입을 제한하지 않은 경우 가장 기본적인 System.Object의 기능만을 사용하게 된다. 타입을 설정하여 해당 제너릭 ..

C#/Advanced C# 2021.11.20

[C#] Task (3) async / await 동작 더 알아보기

async-await 그리고 Task에 대하여는 다음 포스트를 먼저 참고하면 좋습니다. - Overview 2021.10.23 - [C#/Advanced C#] - [C#] Task (1) Async / Await overview - 비동기 프로그래밍 2021.10.23 - [C#/Advanced C#] - [C#] Task (2) 비동기 프로그래밍 Asynchronous Programming Task Asynchronous Programming (TAP)를 위한 async-await를 포함하는 비동기 메서드는 다음과 같이 작성할 수 있다. public async Task AsyncPrint() { await Task.Delay(50).ConfigureAwait(false); // 해당 작업은 작업자 스..

C#/Advanced C# 2021.11.18

IComparable/IComparer/IEquatable : 비교와 관련된 인터페이스

IComparable / IComparable 선후 관계 / 대소 비교 등을 위한 인터페이스를 제공한다. 어떤 클래스의 인스턴스로 이루어진 컬렉션의 정렬을 위해 사용된다. public interface IComparable { int CompareTo([AllowNull] T other); } CompareTo : 해당 메서드는 int 형을 반환하는데 다음의 선후 관계를 의미한다. 0보다 작음 : 해당 인스턴스(Caller)가 other 보다 선의 관계를 가지며 정렬 시 other보다 앞에 배치된다. 0 : other와 동등한 관계이다. 0보다 큼 : 해당 인스턴스가 other 보다 후의 관계를 가지며 정렬 시 other보다 뒤에 배치된다. 예제 public class Temperature : IComp..

ICollection : 컬렉션 인터페이스

ICollection 인터페이스 컬렉션을 구성하는 size, enumerators 그리고 동기화 기법을 정의한다. 기본적으로 IEnumerable을 상속한 인터페이스 public interface ICollection : System.Collections.IEnumerable ICollection 인터페이스는 IEnumerable을 확장하였다. IDictionary와 IList는 ICollection을 확장한 특별한 인터페이스이다. IDictionary는 key/value 쌍을 가지는 컬렉션을 구현한 형태이고, IList는 인덱스로 랜덤 접근이 가능한 컬렉션을 구현한다. Queue나 Stack의 경우 Collection을 바로 구현하여 List와 같이 랜덤 접근이 불가능하다. IDictionary 인터페..

IEnumerable / IEnumerator : 순회 가능한 컬렉션과 순회하는 방법

IEnumerable 인터페이스 Enumerator를 노출시키고 non-generic 컬렉션에 대한 순회를 할 수 있다. IEnumerable는 generic 컬렉션에 대한 순회. IEnumerable 인터페이스 정의 // // 요약: // Exposes an enumerator, which supports a simple iteration over a non-generic collection. public interface IEnumerable { // // 요약: // Returns an enumerator that iterates through a collection. // // 반환 값: // An System.Collections.IEnumerator object that can be used ..

IDisposable : 비관리 리소스 해제하기

IDisposable 인터페이스 비관리 리소스를 해제하는 방법을 제공한다. public interface IDisposable C#에서는 GC가 참조 형식의 객체의 메모리를 자동으로 관리하며, 더 이상 참조되지 않아 메모리가 해제될 때 비관리 리소스를 갖고있는 객체가 해당 인터페이스를 통해 직접 해제할 수 있는 메커니즘을 제공한다. 어느 시점에 해당 리소스가 해제될 지 (GC가 언제 릴리즈할지) 정확한 예측을 할 수는 없으며, GC는 관리되지 않는 리소스(윈도우 핸들이나, 파일 핸들, 스트림 등)를 알 길이 없다. GC와 더불어 사용자가 직접 판단하에 해당 객체가 더 이상 필요없다고 판단할 경우 직접 Dispose()를 호출하여 비관리 리소스를 해제할 수 있다. IDisposable.Dispose의 구현..

[C#] default 연산자

default 연산자 default (T)를 사용하여 T 타입의 기본 값을 가져온다. 값 타입으로부터 0을 반환하고 참조 타입은 null을 반환한다. nullable의 경우 기본 값은 null이며 enum의 경우 0을 기본으로 한다. struct는 값 타입이기 때문에 모든 필드와 속성이 0으로 초기화된 값을 반환한다. class Program { enum MyType { A = 0, B = 1, C = 2 } static void Main(string[] args) { Console.WriteLine(default(int)); // 0 (값 타입) Console.WriteLine(default(object) is null); // true (참조 타입) void DisplayDefaultOf() { va..

C#/C# 기본 2021.11.08

[Effective C#] 2장 .NET 리소스 관리

11. .NET 리소스 관리 .NET 환경에서 관리되는 자원은 메모리 할당과 해제가 항상 관리되며 더 이상 사용되지 않는 리소스는 가비지 컬렉터에 의해 수거된다. .NET에 의해 관리되지 않는 데이터 베이스 연결, GDI 객체, COM 객체, 시스템 객체등의 비관리 리소스들도 있다. 관리되는 리소스들은 모든 리소스들의 참조 관계를 형성하는 참조 트리의 최상위 객체로 부터 도달 가능 여부를 판단하여 가비지 여부를판단한다. 힙에 생성되는 메모리들을 관리하며 가비지 컬렉터는 각 메모리 자원를 분류하여 0세대, 1세대, 2세대 등으로 나누어 오래 살아남을 자원과 빨리 소멸될 자원을 분리하여 관리한다. 0세대 자원들은 생성한지 얼마안 된 자원들이며 이들이 한 번 가비지인지 검사할 때마다 살아남게되면 1세대, 2세..

C#/Advanced C# 2021.11.07