C# Study/이펙티브 C# 맨텀 2021. 5. 2. 16:21
다음 본문은 도서 이펙티브 C# (빌 와그너)에서 나오는 주제를 다룹니다. C# 컴파일러는 LINQ의 쿼리 표현식과 메서드 호출 구문으로 변환한다. C#은 쿼리 표현식 패턴에 포함된 개별 메서드의 의미를 전혀 개의치 않는다. Where 필터 이상의 역할을 수행하지 않는다. where n n < 5); Select 입력값을 다른 타입으로 변환하는 용도로 사용된다. 입력 시퀀스 내의 개별 요소에 대해 각기 새로운 타입의 객체를 생성하여 출력 시퀀스로 내보내지만 요소들을 수정해서는 안된다. var squares = from n in numbers select new { Number = n, Square = n * n }; var squares = numbers.Sele..
C# Study/이펙티브 C# 맨텀 2021. 4. 30. 20:47
다음 본문은 도서 이펙티브 C# (빌 와그너)에서 나오는 주제를 다룹니다. 확장 메서드의 목적은 기존에 개발된 타입을 개선하기 위함이다. 타입의 본질적인 동작 방식을 변경하기 위하여 사용해서는 안된다. 확장 메서드를 과도하게 사용하거나 잘못 사용하면 유지보수 비용이 급격하게 증가하게 된다. 여러 네임 스페이스에 걸쳐 선언된 확장 메서드 다음은 여러 네임스페이스에 같은 이름의 확장메서드를 선언한 코드이다. namespace ConsoleExtensions { public static class ConsoleReport { public static string Format(this Person target) => $"{target.LastName, 20} {target.FirstName, 15}"; } } ..
C# Study/이펙티브 C# 맨텀 2021. 4. 30. 20:26
다음 본문은 도서 이펙티브 C# (빌 와그너)에서 나오는 주제를 다룹니다. 컴포넌트의 계약을 기술하기 델리게이트를 사용하여 컴포넌트의 계약을 기술하면 클라이언트 측에서 코드를 사용하기가 쉬워진다. 다른 개발자가 사용할 코드를 작성하는 경우 의존성 문제를 코드에서 분리하는 것은 상당히 까다롭다. 첫번째방법 : 상속 - 추상 베이스 클래스를 작성하여 이를 상속하는 방식 - 장점 최종 사용자가 컴포넌트를 매우 쉽게 사용할 수 있는 장점이 있다. - 단점 베이스 클래스가 필요로 하는 구성요소를 파생 클래스에서 작성하도록 강요하기 때문에 제약이 크다는 것. 두번째방법 : 인터페이스 - 인터페이스를 작성하고 이를 구현하도록 하는 방식 - 장점 클래스의 계층구조를 강제하지 않으며, 느슨한 결합을 얻을 수 있다는 장점..
C# Study/이펙티브 C# 맨텀 2021. 4. 30. 19:24
다음 본문은 도서 이펙티브 C# (빌 와그너)에서 나오는 주제를 다룹니다. 이터레이터 메서드에 반드시 입력 시퀀스가 필요한 건 아니다. 새로운 컬렉션을 생성하는 팩토리메서드로서 사용할 수도 있다. 일반 메서드로는 다음과 같이 구현해볼 수 있다. 하지만 이 경우 우선 생성한 뒤에 다른 작업들을 할 수 있기 때문에, 사용하지 않는 숫자까지 전부 생성하게될 여지가 있다. static IList CreateSequence(int numberOfElements, int startAt, int stepBy) { var collection = new List(numberOfElements); for(int i = 0; i < numberOfElements; i++) collection.Add(startAt + i *..
C# Study/이펙티브 C# 맨텀 2021. 4. 30. 18:46
다음 본문은 도서 이펙티브 C# (빌 와그너)에서 나오는 주제를 다룹니다. 이터레이터 메서드는 크게 두 종류가 있다. 1. 시퀀스 내에서 개별 항목을 이용하여 작업을 수행하는 메서드 2. 시퀀스의 순회 방식을 변경하는 메서드 일반적으로 여러 가지 작업을 하나의 메서드에 넣는 이유는 메서드 중간을 커스텀화하기 힘들기 때문이다. 하지만 델리게이트를 사용한다면 메서드 중간을 커스텀 하는 것도 가능하다. 하나의 예시로 리스트의 메서드 중 하나인 List.RemoveAll()이 있다. 이 함수는 조건과 일치하는 요소들을 모두 삭제하는데, 이 조건에 Predicate가 사용되었다. myList.RemoveAll(n => n == 5); Action를 사용하는 예는 List.ForEach()가 있다. myList.F..
C# Study/이펙티브 C# 맨텀 2021. 4. 30. 16:59
다음 본문은 도서 이펙티브 C# (빌 와그너)에서 나오는 주제를 다룹니다. 함수를 작성할 때 함수 속에서 foreach, for, while등의 반복문을 사용하여 컬렉션을 다루는 경우는 흔히 있다. 이 경우 각각의 함수마다 컬렉션의 일부를 필터링하거나 내용을 수정하거나 하는 등의 작업 후, 이를 다시 반환하는 식으로 코드를 작성할 것이다. 하지만 대부분의 경우 이러한 작업들은 단일 작업이 아니라 여러 작업을 거쳐야 하며, 각 단계를 거칠 때마다 중간 결과를 저장하기 위해서 추가적으로 메모리 공간이 필요하기도 하며, 매번 전체 컬렉션을 순회하기 때문에 큰 비용이 발생하게 된다. 그렇다면 이러한 함수들을 하나의 루프 내에서 수행되도록 병합해버린다면 어떨까? 특정한 상황에서만 사용할 수 있는 거대한 함수가 만..