전체 글 262

[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

클러스터형 인덱스 / 보조 인덱스

클러스터형 인덱스 데이터 베이스에 저장된 테이블에서 특정 행 데이터를 빠르게 검색하기 위해 사용한다. B-Tree 자료구조를 이용하여 기준이 되는 컬럼값을 정렬하여 사용한다. 페이지를 단위로 노드가 만들어지며 각 노드는 기준값으로 정렬된 행 데이터로 구성된다. 전체 자료구조는 루트 페이지에서 부터 리프 페이지로 나뉘며 계층 구조를 가지는 트리 형태이다. 각 페이지에 행 데이터가 직접 저장된다. 클러스터형 인덱스의 특징 트리 자료구조로 인덱스를 기준으로 검색이 매우 빠르다. MYSQL에서 PRIMARY KEY로 설정된 컬럼은 자동으로 인덱스가 생성되며 기본적으로 인덱스 컬럼을 기준으로 정렬된 테이블이 출력된다. 삽입, 삭제시 B-Tree 자료구조의 특성 때문에 페이지 병합과 분할이 일어난다. 테이블당 하나..

DB/이론 2021.11.29

[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

C# 공변성과 반공변성 Covariance / Contravariance

C#의 인터페이스와 대리자에 적용되는 제너릭 타입의 형변환에 관한 기준이다. Base 기반 클래스와 Derived 파생 클래스가 있다하자. public class Base {} public class Derived : Base {} Covariance 공변성 일반적인 다형성 참조 형식의 캐스팅에도 사용되는 방식으로 파생 타입의 인스턴스를 기반 타입으로 참조할 수 있다. IEnumerable d = new List(); IEnumerable b = d; Contravariance 반공변성 반대로 기반 타입 인스턴스를 파생 타입으로 참조한다. 일반적인 다형성 참조 형식에는 적용되지 않는다. 대리자의 제너릭 타입에만 적용된다. Action b = (target) => { Console.WriteLine(tar..

[Effective C#] 3장 제너릭 활용

C# 제너릭 타입 .NET 런타임이 제너릭 타입을 JIT 컴파일할 때 타입 매개변수에 값 타입이 지정되면 두 단계를 거친다. 1) 닫힌 제너릭 타입을 표현하기 위한 새로운 IL 클래스를 생성한다. T 인자가 구체 타입으로 대체된다. 2) 대체된 타입을 이용하여 실제 기계어 코드를 만들어낸다. 어셈블리가 로드되는 시점이 아니라 로드된 타입의 특정 메서드가 최초로 호출되는 시점에 호출 메서드에 대해서만 JIT 컴파일이 이루어지고 메서드 IL 코드가 기계어 코드로 대체된다. 아이템 18. 반드시 필요한 제약 조건만 설정하라. 제너릭 타입 T에 대한 조건을 설정하여 타입을 제한할 수 있다. 타입을 제한하지 않은 경우 가장 기본적인 System.Object의 기능만을 사용하게 된다. 타입을 설정하여 해당 제너릭 ..

C#/Advanced C# 2021.11.20

[C#] Task (3) async / await 동작 더 알아보기

async-await 그리고 Task에 대하여는 다음 포스트를 먼저 참고하면 좋습니다. - Overview 2021.10.23 - [C#/Advanced C#] - [C#] Task (1) Async / Await overview - 비동기 프로그래밍 2021.10.23 - [C#/Advanced C#] - [C#] Task (2) 비동기 프로그래밍 Asynchronous Programming Task Asynchronous Programming (TAP)를 위한 async-await를 포함하는 비동기 메서드는 다음과 같이 작성할 수 있다. public async Task AsyncPrint() { await Task.Delay(50).ConfigureAwait(false); // 해당 작업은 작업자 스..

C#/Advanced C# 2021.11.18