전체 글 262

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

[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

[C#] 스레드

C#에서 사용되는 스레드와 태스크를 알아본다. 스레드 스레드를 사용함으로써 스레드간 자원 공유가 가능하고 스레드를 이용하여 둘 이상의 로직을 동시에 실행하는 것처럼 만들 수 있으며 멀티 코어를 가진 컴퓨터에서 CPU 이용률을 높인다. 스레드의 생성과 시작 스레드는 새로운 실행 흐름을 만드는 것이므로 함수를 할당하여 스레드를 만들 수 있다. // 쓰레드 인스턴스 생성 Thread t1 = new Thread(new ThreadStart(DoSomething)); public Thread(ParameterizedThreadStart start); public Thread(ThreadStart start); public Thread(ParameterizedThreadStart start, int maxStac..

C#/C# 기본 2021.10.21