반응형

개발공부/C# 34

동기 비동기, 블럭 넌블럭

블록 넌블록 Block 호출된 함수가 할 일을 마칠 때까지 제어권을 가지고 일이 끝나면 호출한 함수에게 제어권을 넘겨준다. Non-Block 호출된 함수가 일이 끝나지 않아도 제어권을 넘겨주고 호출한 함수가 다른 일을 진행할 수 있도록 한다. 동기 비동기 Synchronous 함수 A와 B가 순차적으로 실행하면 동기 Asynchronous 함수 A와 B가 동시에 실행하면 비동기 async, await이란? async await은 비동기 작업을 동기처럼 실행해주는 키워드다. await 동기로 실행하고 싶은 Task를 호출할 때 앞에 await을 붙인다. async 동기로 실행하는 Task를 호출하는 함수 타입 앞에 async를 붙인다. 예시 public async Task CookBread() { Cons..

개발공부/C# 2022.01.10

[Effective C#] 아이템 47 : 사용자 지정 예외 클래스를 완벽하게 작성하라

예외는 오류를 보고하기 위한 메커니즘이다. 오류가 발생한 원인을 나타내기 위한 정보는 반드시 예외 객체에 포함되어야 한다. 언제 예외 클래스를 작성해야 하는가 catch 문을 작성할 때 예외의 런타임 타입에 따라 서로 다른 작업을 수행하도록 코드를 작성하는 것이 일반적이다. 예외 클래스 작성이유 catch 문을 사용하여 예외를 다루는 코드를 작성할 개발자가 각각을 구분해서 서로 다른 작업을 수행할 수 있도록 해주기 위함이다. 그러므로 에러가 발생한 시점에 복구 가능성을 염두에 두고 추가적인 정보를 담도록 예외 클래스를 작성하는 것이 좋다. 새로운 예외 클래스 작성 시 필수적으로 해야 하는 것 다음 4개의 생성자를 작성해야 한다. // 기본 생성자 public Exception(); // 에러 메시지를 포..

개발공부/C# 2021.12.22

[Effective C#] 아이템 46 : 리소스 정리를 위해 using과 try/finally를 활용하라

리소스 정리 시스템 리소스를 사용하는 타입은 IDisposable 인터페이스가 제공하는 Dispose() 메서드를 이용해서 명시적으로 리소스를 해제해야 한다. 사용자 입장에서 Dispose() 메서드가 항상 호출되도록 코드를 작성하기 위한 최선의 방법은 using문이나 try/finally 블록을 활용하는 것이다. Dispose()를 보장하는 방법 Dispose()를 호출해야 하는 경우, using문을 사용하는 것이 가장 간단하다. C# 컴파일러는 using문을 발견하면 해당 객체를 감싸는 try/finally 블록을 자동으로 생성해준다. Close()와 Dispose()의 차이점 Dispose() 리소스를 해제하는 작업 외에 GC.SuppressFinalize()를 호출해서 가비지 수집기에게 객체에 대..

개발공부/C# 2021.12.21

[Effective C#] 아이템 45 : 메서드가 실패했음을 알리기 위해서 예외를 이용하라

메서드가 요청된 작업을 제대로 수행하지 않는 경우 예외를 발생시켜서 실패가 있음을 알려야 한다. 반환 코드를 이용하여 오류를 보고하는 방식보다 예외를 이용하는 방법이 더 나은 이유 오류 코드를 이용하는 경우 사용자가 쉽게 무시할 수 있다. 오류 코드를 검사하고 활용하는 코드 때문에 정상적인 실행 흐름을 방해한다. 그래도 일반적인 실행 흐름을 제어하는 메커니즘으로 예외를 사용해서는 안된다. 반환 코드 특징 반환 코드를 이용하는 방식은 메서드의 원형에 영향을 미친다. 반환 코드는 계산의 결과를 나타내는 용도로 사용되므로 오류가 발생했다는 사실 이외에 추가적인 정보를 전달하기 어렵다. 메서드 호출자에 의해 처리된다. 예외 특징 예외는 클래스 타입이므로 개발자가 자신만의 예외 타입을 파생시킬 수 있고, 오류에 ..

개발공부/C# 2021.12.20

[Effective C#] 아이템 43: 쿼리 결과의 의미를 명확히 강제하고, Single()과 First()를 사용해라

Single() : 정확히 하나의 요소만 반환한다. 만약 쿼리 결과에 어떤 요소도 포함되지 않거나, 여러 개의 요소가 포함되는 경우에는 Single()은 예외를 유발한다. First() : 하나의 요소만 반환 될 것을 기대하지만, 때로는 여러 개의 값이 반환 되는 경우를 허용하고 싶을 때 사용한다. 시퀀스가 비어있는 경우 예외를 발생시킨다. FirstOrDefault() : 하나의 요소만 반환 될 것을 기대하지만, 때로는 여러 개의 값이 반환 되는 경우를 허용하고 싶을 때 사용한다. 시퀀스가 비어있는 경우 기본값을 반환한다. 특정 위치에 있는 요소를 찾을 때 고려해야 할 것 쿼리를 구성하기 위한 다른 속성이 있는지 결과 시퀀스가 IList를 지원하는지 인덱스 작업을 지원하는지

개발공부/C# 2021.12.18

[Effective C#] 아이템 42 : IEnumerable<T> 데이터 소스와 IQueryable<T> 데이터 소스를 구분하라

IQueryable와 IEnumerable는 거의 동일한 API 정의를 갖기 때문에 상호 교환 가능하다. 하지만 이 두 인터페이스는 동작 방식도 매우 다르고 성능도 차이 난다. 결과값은 동일하지만 동작 방식은 다른 예시 //where 절과 order 절이 모두 결합된 단일의 T-SQL 구문을 만들어서 데이터베이스를 한 번만 호출 var q = from c in dbContext.Customers where c.City == "London" select c; var finalAnser = from c in q orderby c.Name select c; 일반적인 LINQ to SQL 쿼리. LINQ to SQL 라이브러리가 모든 쿼리문을 결합하여 단번에 SQL 결과를 생성한다. IQueryable 기능을 ..

개발공부/C# 2021.12.17

[Effective C#] 아이템 40 : 지연 수행과 즉시 수행을 구분하라

선언적 코드와 명령형 코드 선언적 코드: 해설적이며 무슨 작업을 해야 하는지 정의한다. 명령형 코드: 어떻게 작업을 수행해야 하는지 단계별로 세분화해서 기술한다. 필요한 매개변수를 모두 계산한 다음, 메서드를 호출한다. 명령형 코드에서 작업 진행 순서 var answer = DoStuff(Method1(), Method2(), Method3()); DoStuff()의 첫 번째 매개변수를 생성하기 위해 Method1()을 호출한다. DoStuff()의 두 번째 매개변수를 생성하기 위해 Method2()을 호출한다. DoStuff()의 세 번째 매개변수를 생성하기 위해 Method3()을 호출한다. 앞서 계산된 매개변수를 이용하여 DoStuff()를 호출한다. 3개의 메서드를 모두 호출한다. 선언적 코드 작..

개발공부/C# 2021.12.15

[Effective C#] 아이템 38 : 메서드보다 람다 표현식이 낫다.

람다 표현식과 메서드 비교 var allEmployees = FindAllEmployees(); // 20년 이상 근속자 var earlyFolks = from e in allEmployees where e.Classification == EmployeeType.Salary where e.YearsOfService >= 20 where e.MonthlySalary < 4000 select e; // 20년 미만 근속자 var newest = from e in allEmployees where e.Classification == EmployeeType.Salary where e.YearsOfService < 20 where e.MonthlySalary < 4000 select e; 람다 표현식의 단점 동일..

개발공부/C# 2021.12.13

[Effective C#] 아이템 37 : 쿼리를 사용할 때는 즉시 평가보다 지연 평가가 낫다.

지연 평가와 즉시 평가 쿼리를 정의하면 결과 데이터나 시퀀스를 즉각적으로 얻어오지 않는다. 그저 어떤 과정으로 작업을 수행할지 절차를 정의하는 것이다. 지연 평가: 쿼리의 결과를 이용해서 순회를 순행해야 결과가 생성되는 것 즉시 평가: 일반 변수를 사용하는 것처럼 즉각적으로 값을 얻어오는 것 지연 평가와 즉시 평가의 차이 예시 1 시퀀스 생성 후 두 차례에 걸쳐 순회하는 코드 private static IEnumerable Generate( int number, Func generator) { for (var i = 0; i < number; i++) yield return generator(); } private static void LazyEvaluation() { WriteLine($"Start t..

개발공부/C# 2021.12.12

[Effective C#] 아이템 36 : 쿼리 표현식과 메서드 호출 구문이 어떻게 대응되는지 이해하라

Where() 조건을 걸어 만족하는 요소를 추려내는 필터 역할을 한다. var smallNumbers = numbers.Where(n => n n); var squares = numbers.Select(n => new { Number = n, Square = n * n }); OrderBy() 정렬에 사용된다. ThenBy() OrderBy로 정렬 후 재 정렬이 필요할 때 사용된다. var people = employees.Where(e => e.Age > 30). OrderBy(e => e.LastName). ThenBy(e => e.FirstName). The..

개발공부/C# 2021.12.11