본문 바로가기

Develop/.NET 가이드

[C#] LINQ 사용방법 - 정렬 연산자 OrderBy, ThenBy, OrderByDescending, ThenByDescending 정렬 연산자 Ordering Operator 정렬 연산자인 OrderBy는 당연히 출력 시퀀스를 기준에 따라 정렬하는 연산자입니다. 자주 사용하는 연산자이므로 여러 예제를 통해 익히고 자주 사용하여 경험을 쌓길 바랍니다. 원소 정렬하기 알파벳 순서로 정렬합니다. string[] words = { "cherry", "apple", "blueberry" }; var sortedWords = from word in words orderby word select word; // sortedWords = { "apple", "blueberry", "cherry" }; 원소의 속성으로 정렬하기 String.Length 속성을 사용하여 정렬합니다. string[] words = { "cherry", "apple", ..
[C#] LINQ 사용방법 - 분할 연산자 Take, Skip, TakeWhile, SkipWhile 분할 연산자 Partition Operator LINQ 에서 제공하는 확장 메서드 중 Take, Skip, TakeWhile, SkipWhile 을 분할 연산자라 합니다. 왜냐하면 분할 연산자는 출력 시퀀스를 분할시켜 반환하기 때문입니다. Take 분할 연산자 Take 메서드로 numbers 배열에서 처음 3개의 원소만 꺼내 출력 시퀀스를 만듭니다. int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }; var first3Numbers = numbers.Take(3); // first3Numbers = { 5, 4, 1 }; 출력 시퀀스는 Ienumerable 인터페이스로 반환되므로, LINQ 결과에 Take 메서드를 연결하여 사용할 수 있습니다. List custome..
[C#] LINQ 사용방법 - Select Select Select 절은 입력 시퀀스를 원하는 출력 시퀀스로 변환합니다. Select 절 입력 시퀸스에 1을 더하여 출력 시퀀스를 만듭니다. int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }; var numsPlusOne = from n in numbers select n + 1; // numsPlusOne = { 6, 5, 2, 4, 10, 9, 7, 8, 3, 1 }; 하나의 속성만 선택하기 products 객체로 이루어진 입력 시퀀스에서 ProductName 속성으로 출력 시퀀스를 만듭니다. List products = GetProductList(); var productNames = from p in products select p.ProductName;..
[C#] LINQ 사용방법 - Where 개요 LINQ 문법은 간단합니다. 하지만 간단한 구문을 복합하여 사용하려고 하면 어떻게 해야 할지 감이 잡히지 않습니다. 그래서 괜히 스택오버플로우에 비슷한 쿼리 문이 없나 뒤적거리게 됩니다. LINQ 개념은 쉽게 설명된 블로그 글도 많고, 개념 자체는 어렵지 않아 금방 이해하게 됩니다. 하지만 실제로 사용할 때 애를 먹는 이유는 LINQ 를 실제로 사용해 본 경험이 부족하기 때문입니다. 그래서 간단한 예제부터 복잡한 예제까지 순차적으로 LINQ 문법의 경험치를 올릴 수 있도록 준비해보았습니다. Where LINQ 에서 Where 절은 질의 결과를 제한하는 절입니다. 오직 Where 절 조건에 맞는 요소만이 결과 시퀀스에 추가되어 출력됩니다. LINQ 쿼리 구조 아래 예제는 Where 절을 사용하여 배열..
[C#] Attributes 특성 Attributes 특성 Attributes 특성의 대표적인 특징은 소스 코드에 메타데이터를 추가하여, 런타임 환경에서 소스 코드의 메타데이터에 접근할 수 있다는 점입니다. 특성은 개발자가 자신의 필요에 따라 유연하게 사용하기 보다는 필요한 상황에 .NET 이 제공하는 클래스를 활용하는 방법이 주를 이룹니다. 왜냐하면 특성은 특정 상황에 사용되도록 설계된 기능이기도 하고, 일반적인 응용 프로그램이 소스 코드 의 메타 데이터가 필요한 경우는 드물기 때문입니다. 특성을 활용하는 일반적인 상황 아래와 같은 상황이 개발자가 특성을 활용하게 되는 대부분의 상황에 해당합니다. [DllImport] : 운영체제 네이티브 코드 호출에 필요한 메타데이터를 제공하는 특성 [Obsolete] : 개발자 간의 협업을 위해 특..
[C#] Delegates 대리자와 Events 이벤트 중 선택하기 Delegates 대리자와 Events 이벤트 중 선택하기 C# 의 언어 기능 중 Delegates 대리자와 Events 이벤트는 매우 유사합니다. 심지어 이벤트는 대리자 기능에 기반을 두고 있죠. 대리자와 이벤트 둘 다 런타임에 구현 코드가 바인딩되는 시나리오로 구성되어 있습니다. 또 두 기능 모두 Invoke() 메서드로 호출됩니다. 이러한 유사성으로 인해 언제 대리자를 또는 이벤트를 사용할지 결정하기가 어려울 수 있습니다. 대리자와 이벤트 중 어떤 언어 기능을 사용할지 결정할 때 가장 중요하게 고려해야 할 사항은 구독자가 있어야 하는지의 여부입니다. 대리자의 경우 구독자가 없다면 메서드를 호출하는 의미가 없으므로, 구독자가 필수적으로 필요합니다. 만약 대리자를 메서드의 매개 변수로 넘겨주는데, 대리..
[C#] Events 이벤트 Events 이벤트 먼저 용어부터 정리해보도록 합시다. 프로그래밍 세계에서 이벤트는 하나의 개념이 아니라 하나의 시스템입니다. 이벤트는 사용자의 클릭과 같은 행동에 대해 프로그램이 순차적으로 반응을 일으킬 수 있도록 고안된 시스템입니다. 디자인 세계에서는 이를 인터렉션이라 하죠. 옛날 옛적에 프로그램이 순차적으로 실행되는 코드에 불과하던 어셈블리어 시절, 이벤트라는 시스템은 불필요했습니다. 왜냐하면 사용자는 프로그램에게 명령어를 지정해 실행하는 행동만 취할 수 있었으니까요. 프로그램이 처리해야 할 이벤트는 '실행'에 따른 '결과'를 검은 배경에 하얀 글자로만 출력하면 되었습니다. 하지만 그래픽 인터페이스의 등장으로 사용자는 마우스로 다양한 버튼을 클릭할 수 있게 됩니다. 즉 ..
[C#] Covariance 공변성 및 Contravariance 반공변성 공변성 및 반공변성 마이크로소프트의 공식문서에서 공변성과 반공변성에 대한 개념을 소개하고는 있지만, 저는 이해하기가 너무 어려웠습니다. 저에게는 글 구성이 너무 난해하고 배경 설명이 너무 부족했습니다. 그래서 저와 같은 어려움을 겪는 개발자를 위해 제 나름대로 이해한 내용을 정리하여 기록해봅니다. 모두에게 유익한 글이 되기를... 상속 관계에 있는 클래스는 서로 형변환이 가능합니다. 다만 형변환을 하게 되면 정의된 범위와 구현된 범위가 달라지게 됩니다. 그래서 객체 간에 형변환을 하게 되면 예상치 못한 예외가 발생하곤 합니다. 특히 공변성과 반공변성이라는 개념은 이러한 형변환으로 파생되는 예외와 관련된 개념입니다. C# 언어가 발전하면서 .NET 내부적으로 제네릭 타입과 대리자 기능을 활발하게 사용되었습..