C#/Advanced C# 16

[C#] BitConverter 클래스

System.BitConverter 클래스를 통해서 리터럴 타입의 변수 (int, long 등)의 값을 byte[] 바이트로 변환한 값을 얻을 수 있다. 리틀 엔디안 시스템 MSB(Most Significant Bit)가 낮은 주소에 할당 된다. LSB(Least Significant Bit)가 높은 주소로 온다. 정확히는 바이트 단위로 할당된다. ex) 0x09ABCDEF -> (낮은 주소) | EF | CD | AB | 09 | (높은 주소)식으로 만들어진다. Console.WriteLine(BitConverter.IsLittleEndian); // 리틀 엔디안 시스템 바이트 데이터 출력 바이트 배열을 출력하는 헬퍼 함수 public static void PrintBytes(byte[] bytes) ..

C#/Advanced C# 2022.04.14

[More Effective C#] 4장 병렬 처리

아이템 35. PLINQ가 병렬 알고리즘을 구현하는 방법을 이해하라 AsParallel()로 생성되는 병렬 버전의 순회 타입 ParallelEnumerable와 관련된 기능을 알아본다. LINQ to Objects로 실행되는 예제를 위주로 알아본다. PLINQ는 LINQ to SQL이나 EntitiyFramework 알고리즘을 병렬화 하는 데 별로 도움이 안 된다. 어차피 쿼리를 병렬 처리하기 위해 데이터 베이스 엔진의 병렬 처리 기능을 사용하기 때문이다. public static void PLINQ_Ex1() { List data = new List() { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; // 순차 순회 var nums = data.Where(m => m < 150).Select(n..

C#/Advanced C# 2021.12.18

[C# Thread] BackgroundWorker 클래스

System.ComponentModel.BackgroundWorker 클래스 백그라운드에서 동작하는 스레드를 사용하는 스레드 풀을 사용하여 작업을 실행할 수 있는 클래스 내부적으로 System.Threading.Thread.QueueUserWorkItem() 함수를 이용하여 작업을 실행한다. 백그라운드 스레드가 예외를 던지면 전체 어플리케이션이 종료할 수 있다. BackgroundWorker 는 백그라운드에서 실행되는 작업에서 발생하는 취소, 예외나 진행상황을 포그라운드(Foreground) 스레드에 전달할 수 있다. 따라서 스레드간 커뮤니케이션을 가능하게한다. 작업의 실행 DoWork 속성에 실행할 작업의 대리자를 등록한다. RunWorkerAsync()는 등록된 작업을 실행한다. System.Thre..

C#/Advanced C# 2021.12.15

[More Effective C#] 3장 태스크 기반 비동기 프로그래밍

아이템 27. 비동기 작업에는 비동기 메서드를 사용하라 public static async Task SomeMethodAsnyc() { Console.WriteLine("SomeMethod Begins..."); Task assignedTask = AssignedTaskBegin(); var result = await assignedTask; Console.WriteLine("SomeMethod Ends"); } 비동기 메서드는 비동기 작업을 포함하는 메서드를 의미한다. Task assignedTask = AssignedTaskBegin(); 라인에서 비동기 작업이 시작되고 해당 결과를 전달받을 수 있는 Task 객체를 반환한다. 비동기 메서드의 async-await 구문은 기본적으로는 해당 메서드가 동..

C#/Advanced C# 2021.12.13

[More Effective C#] 2장 API 설계 (2)

아이템 20. 이벤트가 런타임 시 객체 간의 결합도를 증가시킨다는 것을 이해하라 이전 이벤트 핸들러 패턴의 예시로 만든 SystemChannel 클래스를 본다. public class SystemChannel { private Channel curChannel; public event EventHandler OnChanged { add { OnChanged += value; } remove { OnChanged -= value; } public void ChangeChannel(channel c) { // 새로운 채널 할당으로 이벤트를 발생시킨다. var oldChannel = curChannel; curChannel = c; var args = new ChannelChangedEventArgs(oldC..

C#/Advanced C# 2021.12.12

[More Effective C#] 2장 API 설계 (1)

아이템 11. API에는 변환 연산자를 작성하지 말라 변환 연산자 Conversion Operator, 대체가능 한 클래스로 변환하는 것을 의미한다. 어떤 타입이든 System.Object 타입으로 변환 가능하다. 인터페이스를 구현한 클래스는 인터페이스로 베이스 클래스를 상속한 클래스는 베이스 클래스로 대체 가능하다. public class Circle : Shape { private Coord center; private int radius; public Circle(Coord c, int r) { this.center = c; this.radius = r; } static public implicit operator Ellipse(Circle c) { return new Ellipse(c.center..

C#/Advanced C# 2021.12.12

[More Effective C#] 1장 데이터 타입

아이템 1. 접근 가능한 데이터 멤버 대신 속성을 사용하라 속성(Property)는 멤버 변수를 접근하는 방법을 제공하며 메서드로 구현된 요소이다. get; set;에 접근 지정자를 지정할 수 있고 OOP의 은닉성을 유지할 수 있다. 속성을 통해 해당 변수의 접근을 통제하고 읽고 쓰는 방식을 한 곳에 관리할 수 있다. public class Card { public Name { get; set; } } C#의 암묵적 속성을 사용하면 컴파일러는 해당 클래스의 private 필드에 name이라는 멤버 변수를 정의해준다. get; set; 키워드는 해당 멤버 변수를 접근해줄 수 있는 메서드를 각각 생성하여 속성을 통해 쉽게 사용할 수 있도록 한다. 속성(혹은 인덱서)는 ref나 out 매개변수가 있는 메서드에..

C#/Advanced C# 2021.12.04

[Effective C#] 5장 예외 처리

아이템 45. 메서드가 실패했음을 알리기 위해서 예외를 이용하라 어떤 메서드가 실패했음을 알리기위해 반환값으로 오류코드를 사용하기도한다. 반면 예외의 발생은 콜 스택을 통해 적절한 catch문을 만날 때까지 콜스택을 통해 전파된다. 코드 작성자는 에러를 발생시키는 위치와 처리하는 부분을 분리시켜 개발할 수 있다. 특정 메서드는 예상치 못한 상황에 대해 예외를 발생시키도록 설계할 수 도 있고 그러한 상황을 정상적으로 처리할 수 있는 것으로 설계할 수도 있다. ex) File.Open()는 파일이 없을 때 예외를 발생시킬 수 있다. 있어야하는 파일이 없기 때문이고 더 이상 프로그램을 진행할 수 없기 때문이다. 반면, File.Exists()는 파일이 있는 지만 체크하고 있든 없든 그에 따른 프로그램을 작성할..

C#/Advanced C# 2021.11.27

[Effective C#] 4장 LINQ 활용 (2)

아이템 36. 쿼리 표현식과 메서드 호출 구문이 어떻게 대응되는지 이해하라 LINQ는 쿼리 언어와 그 쿼리 언어를 일련의 메서드 집합으로 변환하는 2개의 핵심 구조로 기반한다. 모든 쿼리식은 하나 혹은 여러 개의 메서드로 매핑된다. 클래스 사용자의 관점에서 볼 때 쿼리 표현식은 단순히 메서드 호출 구문의 다른 표현 이다. 예로 where 절은 Where() 메서드를 호출하는 코드로 변환된다. 쿼리 표현식의 예 Where / Select / SelectMany / Join / GroupJoin / OrderBy / OrderByDescending 이러한 메서드는 System.Linq.Enumerable 클래스는 IEnumerable에 대한 확장 메서드로 구현하고 있다. 비슷하게 System.Linq.Que..

C#/Advanced C# 2021.11.24

[Effective C#] 4장 LINQ 활용 (1)

아이템 29. 컬렉션을 반환하기보다 이터레이터를 반환하는 것이 낫다 이터레이터 메서드 - 호출자가 시퀀스를 만들어내기 위해 yield return 을 사용하는 것을 말한다. public static IEnumerable GenerateAlphabet() { var letter = 'a'; while(letter $"{target.LastName, 20}, {target.FirstName, 15}" } } // XmlExtensions.cs namespace XmlExtensions { public static class XmlReport { public static string Format(this Person target) => new XElement("Person", new XElement("Last..

C#/Advanced C# 2021.11.24