본문 바로가기

반응형

C#

(31)
[C#] 비동기 프로그래밍 - async io 동기와 비동기의 차이 이전 포스트 [C#] 비동기 프로그래밍 - async/await에서는 연산 중심의 비동기 메소드를 작성하는 방법에 대해 살펴 보았다. 이번 포스트에서는 IO 중심의 비동기 예를 살펴 보도록하겠다. 먼저 동기 IO가 어떻게 이루어지는 아래 그림을 통해 살펴 보자. 예를 들어 FileStream 객체의 Write메소드를 이용해 파일에 무엇인가 쓰려고하면 아래 그림과 같은 과정이 진행 된다. 실제 쓰기 작업은 프로그램이나 OS 영역이 아닌 하드웨어 영역에서 이루어지는데 동기 IO, 그러니까, 블로킹 호출에서는 쓰기 작업이 완료 될 때까지 프로그램이 대기하게 된다. 비동기는 IO를 요청하고 대기하는 것이 아니라 즉시 리턴 한다. 그리고 IO작업이 완료 되면 OS를 통해 그 완료를 통보 받아..
[C#] 비동기 프로그래밍 - async/await 들어가며 이전 포스트에서는 C#의 'Task' 사용법에 대해 알아 보았다. 예를 들어 여러분이 Task를 이용해 GUI 프로그램을 만든다고 가정하자. GUI프로그램은 UI이벤트를 처리하기 위해 메인 스레드는 블로킹 되지 않고 항상 유저의 입력을 받을 수 있도록 블로킹 되지 않아야 하며, 따라서 시간이 오래 걸리는 작업들은 Task를 이용해 다른 스레드에서 한다. 그리고 작업들이 처리되어야 하는 순서가 있다면 - 연속 실행 또는 연속 작업이라고 함 - Task의 ContinueWith 메소드 또는 TaskAwaiter를 이용하여 Task가 완료 되면 등록된 다음 작업을 처리 한다. Task에 대한 설명은 [여기]에서 찾아 볼 수 있다. 이번 포스트는 Task의 사용법에 대해서는 따로 설명을 하지 않을 예정..
[C#] 비동기 프로그래밍 - Task 이번 포스트에서는 스레드와 스레드 풀의 제약 사항을 해결해줄 'Task'에 대해 살펴 보겠다. 들어가며 [C#] Thread [C#] ThreadPool 이전 까지 포스트에서 C#의 스레드에 대해 알아 보았다. 앞의 글을 안봤다고 다시 돌아가서 볼 필요는 없다. 앞의 글들은 단지 이번 포스트 "Task"를 설명하기 위한 준비작업이었을 뿐이다. 간단하게 앞의 내용을 요약하면, 스레드를 지속적으로 생성하고 삭제하면 오버헤드가 발생한다. 이것을 해결하기 위해 스레드 풀을 사용했지만, C# 스레드 풀의 제약 사항으로인해 작업이 완료 되기도 전에 프로세스가 종료 될 수 있다는 단점이 있었다(이유가 궁금하면 위 링크 되어있는 포스트들에 정리해놨으니 살펴보고 오도록하자). 이 모든 단점을 커버 해주는 것이 이번에 소..
[C#] 비동기 프로그래밍 - ThreadPool 들어가며 프로세스에서 스레드를 새로 만들었다 삭제하는 것을 반복하면 스레드 생성에 대한 오버헤드가 발생한다. 그래서 일반적으로 프로세스에 스레드 풀을 생성하고 스레드 작업이 필요한 경우 풀에서 스레드를 꺼내와 사용하고 작업이 끝나면 해제하는 것이 아니라 스레드 풀에 되돌려 주는 방식으로 성능의 향상을 꾀한다. C#에서는 이런 스레드풀을 언어 레벨에서 지원한다. 스레드 수행 할 작업을 스레드 풀의 큐에 넣으면 내부적으로 스레드를 생성하거나 기존 생성되어 있던 스레드를 가져와 작업을 수행 후 스레드를 삭제하는 것이 아니라 대기 상태로 유지 시킨다. CLR[?]은 이 스레드풀에 최적의 스레드 개수를 유지하도록 관리해준다. ThreadPool 사용 using System; using System.Threadin..
[C#] 비동기 프로그래밍 - Thread 이번 포스트에서는 C# 스레드 생성하고 사용하는 기본적인 방법에 대해서 살펴 보겠다. 스레드의 개념적인 부분은 이미 알고 있다고 가정하고 API 사용법에 대해서만 다룰 예정이다. Thread 생성 아래는 메인 스레드와 사용자가 생성한 스레드에서 각각의 번호를 만번씩 출력하는 예제이다. 스레드를 통해 동시에(concurrency) 코드를 진행하므로 1과 2가 섞여서 출력 되는 것을 확인 할 수 있다. using System; using System.Threading; // Thread를 위한 네임스페이스 class Program { public static void Foo() { for (int i = 0; i < 10000; i++) { Console.Write("1"); } } public static..
[C#] null 병합 할당(Null Coalescing Assignment) null 병합 연산자 C# 6.0에는 물음표 두개를 연달아 쓰는 null 병합 연산자라는 것이 있다. string s1 = null; string s2 = s1 ?? "hell"; // s1이 null이 아닌 경우 s1을 대입, null인 경우 "hello"를 대입 조사하는 대상이 null이 아닌 경우, 그 값을 넣고, null인 경우 물음표 뒤의 값을 대입하라는 의미다. null 병합 대입 C# 8.0 부터는 null 병합 대입이라는 것이 추가 되었다. 영어로는 "Null Coalescing Assignment"라고 한다. 위의 병합 연산자는 s1의 값을 다른 변수에 대입하는 것이었지만 null 병합 대입은 반대다. s1의 값이 null일 경우 s1에 다른 값을 대입하겠다는 의미다. 연산자는 ??= 를..
[C#] nullable reference 이번 포스트는 개인적으로 쓸까 말까 고민을 많이 했다. 읽다 보면 알게 되겠지만 이게 무슨 개소린가 싶은 전처리 문법이 C# 8.0에 추가 되었다. nullable 값 형식 C#에서 값 타입 변수에 null을 대입하면 오류가 나지만 타입 뒤에 물음표(?)를 붙여주면 "nullable 허용 값 형식"이라고 값을 가지는 변수지만 null을 지정 할 수도 있다. int m1 = 10; // 정상 int m2 = null; // 에러 int? m3 = null; // 정상 물론 string과 같은 참조 타입 변수는 null을 대입해도 아무런 문제가 없다. string s = null; int len = s.Length; // exception 그런데 문제는 이렇게 null 값을 대입 할 수 있도록 해놓으니 위 ..
[C#] using 키워드 in 8.0 C#에서 using 키워드는 두 가지 의미로 사용 된다. 지시문으로써 using 다른 네임스페이스에 정의된 타입을 Import 하거나, 네임스페이스에 대한 별칭을 만들때 사용. using System //코드 상단에 네임스페이스 정의 using Project = PC.MyCompany.Project; // 별칭 C# 6.0 부터 using static 문법이 추가 되었다. 스태틱 메소드를 클래스 이름을 명시하지 않고 호출하기 위해 사용 된다. using static System.Console; // WriteLine("Hello World!") ... WriteLine("Hello World!"); // Console이 생략 되었다 'using' statement 객체의 라이프 사이클을 제어하기 위해 사..
[C#] Local Function 이번 포스트는 C#의 로컬 함수(local function)이라는 개념에 대해서 살펴 보도록한다. 초보자 대상이 아닌 어느 정도 C#과 프로그래밍에 대한 개념이 있는 사람을 대상으로 작성하였으므로 개념이나 코드에 관련된 설명 중 기본적인 부분은 생략되어 있는 부분이 많다. 이해가 잘 안가는 부분들에 대해서 댓글로 남겨 주시면 성실히 답변해 드리도록 하겠다. Local Function이란? C# 7.0 부터 추가 된 개념으로써 메소드 안에 메소드를 정의 할 수 있는 문법이다. 메소드 안에 다시 메소드를 만드는 문법 자신이 포함된 메소드에서만 호출할 수 있다. public double Divide(double a, double b) { double real_devide(double a, double b) /..
[C#] switch expression in 8.0 C# 8.0 부터 추가된 switch expression에 대해서 알아 보도록 하겠다. 이번 포스트는 문법 보다는 개념적인 부분을 많이 다루려 한다. 가장 먼저 '문(statement)'와 비교하여 '표현식(expression)'이 무엇인지 개념에 대해 살펴보고, 기존 switch statement와 switch expression의 개념적 차이에 대해서 살펴 본다. 개념을 간단히 이해한 후 switch expression의 활용 방안에 대해 본격적으로 알아 보도록 하자. 문? vs 표현식? C# 8.0에는 switch statement에 이어 switch expression이 추가 되었다. 먼저 statement와 expression의 차이를 알아 보자. Statement(문, 문장) 프로그램을 구성하..

반응형