C# 40

[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

[C#] 파일 입출력

C#에서 IO와 관련된 기능을 알아본다. 파일 정보와 디렉토리 정보 System.IO 네임스페이스 안에 포함되어 있다. 파일의 생성, 복사, 삭제, 이동 등의 기능을 지원하는 클래스 - File(정적 메서드), FileInfo(인스턴스 메서드) 디렉토리의 생성, 삭제, 이동, 조회를 처리하는 클래스 - Directory(정적 메서드), DirectoryInfo(인스턴스 메서드) 파일과 디렉터리관련 함수 기능 File FileInfo Directory DirectoryInfo 생성 Create() Create() CreateDirectory() Create() 복사 Copy() CopyTo() - - 삭제 Delete() Delete() Delete() Delete() 이동 Move() MoveTo() M..

C#/C# 기본 2021.10.21

[C#] dynamic 타입

dynamic .NET과 COM과 같은 외부 API 그리고 다른 언어를 C#에서 실행할 때 사용할 수 있는 형식이다. dynamic의 기능 C#에서 제공하는 형식 검사를 dynamic 형식에 대해 수행하지 않는다. 대신 정상적으로 동적 실행 시간에 실행될 것이라고 기대하여 dynamic 타입을 지정한다. class MyClass { public void FuncA() {} } static void Main(string[] args) { MyClass inst = new MyClass(); inst.FuncA(); inst.FuncB(); // Not OK dynamic inst2 = new MyClass(); inst2.FuncA(); inst2.FuncB(); // No Compile Error } d..

C#/C# 기본 2021.10.19

[C#] 리플렉션과 애트리뷰트

C#에서 제공하는 형식의 메타 정보를 의미하며 이 형식 정보를 이용하여 직접 개체를 생성하거나 프로퍼티를 사용, 메서드를 호출할 수 있다. Object의 GetType() 메서드 모든 개체의 공통 조상인 Object에는 GetType() 메서드를 가지고 있다. 이 메서드가 반환하는 것은 해당 타입 정보를 가지고 있는 Type 이라는 클래스의 인스턴스이다. int a = 0; Type type = a.GetType(); FieldInfo[] fields = type.GetFields(); foreach (FieldInfo field in fields) Console.WriteLine($"Type : {field.FieldType.Name}, Name : {field.Name}"); 위와 같이 Type 클래..

C#/C# 기본 2021.10.19

[C#] LINQ

LINQ : Language INtegrated Query, C#에 도입된 통합된 데이터 질의 기능 SQL 언어랑 비슷하며 데이터를 다루기 위한 문법이다. Name과 Height를 프로퍼티로 가지는 Profile 클래스가 있다하자. 다음과 같은 배열에서 Height가 175 미만인 인스턴스를 오름차순으로 정렬하고 싶을때 만족하는 Profile 인스턴스만 찾고 싶다면 긴 문법을 작성해야한다. Profile[] arrProfile = { new Profile(){ Name = "정우성", Height = 186}, new Profile(){ Name = "김태희", Height = 158}, new Profile(){ Name = "고현정", Height = 172}, new Profile(){ Name =..

C#/C# 기본 2021.10.18

[C#] 람다식

람다식 함수형 프로그래밍의 근간이 되는 람다 계산법에서 사용하는 식을 말한다. C#에서 표현하는 람다식은 매개변수_목록 => 식 으로 표현된다. - 예시 delegate int Function(int a, int b); static void Main(string[] args) { Function func = (int a, int b) => a + b; } 컴파일러는 람다의 매개 변수의 타입을 지정하지 않아도 타입 유추를 통해 가능하다면 람다 함수를 생성할 수 있다. Function func = (a, b) => a + b; 단일 실행문장이 아닌 여러 세미 콜론을 사용하는 문의 경우 중괄호를 이용하여 그 안에 실행하는 문장을 표현한다. Function func = (a, b) => { int c = a +..

C#/C# 기본 2021.10.15

[C#] 대리자와 이벤트

대리자 delegate 대리자란 함수의 호출을 대신하는 객체로 C++의 function 혹은 임의의 함수를 타입지정하는 것과 유사하다. 한정자 delegate 반환 형식 대리자_이름(매개변수_목록) delegate int MyDelegate(int a, int b); MyDelegate 타입은 두 int 형 매개변수를 받아 int를 반환하는 함수를 의미한다. 대리자를 통한 함수 호출은 다음과 같다. 1) 대리자를 선언한다. 2) 대리자 인스턴스를 만들고 함수를 등록한다. 3) 대리자를 호출한다. C++과 다르게 대리자의 함수의 경우 멤버 함수와 정적 함수 모두 형식만 맞으면 등록하여 호출할 수 있다는 점이다. C++에서 멤버 함수의 경우 첫번쨰 인자에 인스턴스를 바인딩해야한다. class Calculat..

C#/C# 기본 2021.10.15