C#/Advanced C# 16

[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

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

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

C#/Advanced C# 2021.11.07

[Effective C#] 1장 언어요소

1) 지역변수를 선언할 때는 var를 사용하는 것이 좋다. IEnumerable와 IQueryable를 사용할 때, IQueryable를 IEnumerable로 캐스팅하여 사용할 경우 해당 인터페이스의 기능을 사용하지 못하게 된다. var는 컴파일 시간에 정적으로 타입을 추론하여 결정된다. var를 이용하여 간단히 변수를 선언하고 그 의미는 변수 명에 기입할 수 있다. var ipAddress = IPEndPoint.Parse("127.0.0.1"); // 반환되는 변수는 IpAddress와 관련됌 var SellingProduct = someObject.DoSomeWork(params); // ""는 Product와 관련됌 대체적으로 내장 타입에 대한 var의 이용은 좋지 않다. ex)float,dou..

C#/Advanced C# 2021.11.04

[C#] Task (2) 비동기 프로그래밍 Asynchronous Programming

지난 정리에서 Task를 사용하는 async와 await의 특징은 다음과 같았다. async 키워드는 해당 메서드, 람다, 이벤트 처리기 등을 수식하여 비동기 동작을 하나라도 포함하는 것을 말한다. async 키워드를 사용한 함수에서 반드시 await를 사용해야한다. 그렇지 않으면 컴파일러는 해당 함수를 동기(Synchronous) 작업으로 취급한다. async 키워드를 사용한 함수는 비동기 메서드의 결과와 연관된 Task를 반환해야한다. Task를 직접 생성하여 둘 이상의 비동기 작업을 동시에 시작하는 것을 고려하고 await의 순서에 따라 성능이 달라질 수 있다. Task.Wait(), Task.WhenAll() 혹은 Task.WhenAll()과 같은 함수로 비동기 메서드가 완료될 때까지 기다릴 수 ..

C#/Advanced C# 2021.10.23

[C#] Task (1) Async / Await overview

C#에서 병렬 처리나 비동기 작업을 수행하기 위해 제공하는 기능을 알아본다. System.Threading.Tasks 네임스페이스에 포함된 Task, Task, Parallel 클래스 비동기 코드는 비동기 메소드를 호출하여 그 메소드가 종료되어 반환되기 전까지 기다리지 않고 계속 실행하는 것을 의미한다. 비동기의 반대, 동기 코드는 일반적인 실행 흐름과 같으며 한 라인이 실행되어야 다음 라인이 실행될 수 있다. Task 클래스 Task는 반환형이 void인 함수 타입, Action 대리자를 받아 Thread 스레드 개체를 생성하는 것처럼 Action을 할당한다. Task myFirstTask = new Task(() => { Console.WriteLine("A new task"); }); myFirst..

C#/Advanced C# 2021.10.23