SlideShare a Scribd company logo
1 of 30
C# 답게 쓰자
김 기 원
LINQ
(Language-INtegrated Query)
Page  2
Agenda
1. History of C#
2. Delegate
3. Action<T>
4. Func<T>
5. Anonymous methods
6. Implicitly typed local variables
7. Anonymous types
8. Lambda expressions
9. Extension methods
10. Query expressions
11. LINQ
12. Extension methods Tips
Page  3
1. History of C# (1/2)
Version .NET Framework Visual Studio Important Features
C# 1.0 .NET Framework
1.0/1.1
Visual Studio .NET
2002
•Class / Structure / Interface
•Event
•Property
•Delegate
•Attribute
C# 2.0 .NET Framework
2.0
Visual Studio 2005 •Generics
•Partial types
•Anonymous methods
•Nullable types
•Iterators
•Covariance and contravariance
C# 3.0 .NET Framework
3.03.5
Visual Studio 2008 •Auto-implemented properties
•Anonymous types
•Query expressions
•Lambda expression
•Expression trees
•Extension methods
•Object and collection initializer
C# 4.0 .NET Framework
4.0
Visual Studio 2010 •Dynamic binding (dynamic)
•Named/optional arguments
•Generic covariant and contravariant
•Embedded interop types
Page  4
1. History of C# (2/2)
Version .NET Framework Visual Studio Important Features
C# 5.0 .NET Framework
4.5
Visual Studio 2012
/2013
•Asynchronous members (async/await)
•Caller info attributes
C# 6.0 .NET Framework
4.6
Visual Studio 2013
/2015
•Static imports
•Exception filters
•Property initializers
•Expression bodied members
•Null propagator
•String interpolation
•nameof operator
•Dictionary initializer
C# 7.0
7.1
7.2
7.3
.NET Core Visual Studio 2017 •Out variables(out int variable)
•Named tuple
•Pattern matching
•Local function(anonymous method)
•Expanded expressions bodies members
•Ref locals and returns
Page  5
2. Delegate
 = Method signature
 ≒ interface
 Invoke, BeginInvoke 를 사용하여 호출할 수 있음
 Method의 parameter로 전달할 수 있음
 Class의 필드(field)나 속성(property)에 사용될 수 있음
 Delegate를 할당(=), 추가(+=), 제거(-=) 할 수 있음
 Event (=MulticastDelegate)
Page  6
02_Delegate
Page  7
3. Action<in T>
 매개변수가 1~16개이고 값을 반환하지 않는 메서드를 캡슐화 함
 Mscorelib.dll
 System.Core
Page  8
4. Func<in T, out TResult>
 매개변수가 0~16개이고 지정된 형식의 값을 반환하는 메서드를 캡슐화
함.
 Mscorelib.dll
 System.Core
Page  9
03_Action_T
Page  10
5. Anonymous methods (무명 메서드)
 C# 2.0 이전 버전의 delegate 사용은 명명된 메서드(named method) 만
을 사용
 C# 2.0 에서는 무명 메서드(anonymous method)
 C# 3.0 이상에서는 람다 식(Lambda Expressions)
Page  11
05_AnonymousMethod
Page  12
6. Implicitly typed local variables (암시적 형식 지역 변수)
 var (=variable) keyword
 컴파일러가 적절한 형식을 결정
 dynamic keyword 처럼 형식이 동적이지 않음
 개발 편의를 위해 사용되는 keyword
(사용하지 않을 경우 실제 클래스를 구현해야 함)
 지역 변수로만 사용(형식을 알 수 있게 초기화 되어야 함)
 클래스 범위의 필드에서는 사용할 수 없음
 남용할 경우 코드 가독성 저하
 Visual Studio의 Intellisense로 형식 유추 가능
[ ILSpy로 확인 ]
Page  13
7. Anonymous types (무명 형식) (1/2)
 명시적 형식을 정의할 필요가 없음
 읽기 전용 속성 집합의 단일 개체로 캡슐화 할 수 있음
 형식 이름은 컴파일러에 의해 생성되며 소스 수준에서는 사용할 수 없음
 new 연산자를 개체 이니셜라이저(object initializer): new { }; 와 함께 사용
하여 생성
 object 이외의 개체로는 캐스팅 (casting) 할 수 없음
 필드(field), 속성(property) 이벤트(event), 메서드 반환 형식(method
return type)은 선언할 수 없음
 Visual Studio의 IIntellisense로 형식 유추 가능
Page  14
7. Anonymous types (무명 형식) (2/2)
 컴파일러가 내부적으로 형식을 생성함
[ ILSpy로 확인 ]
Page  15
06_ImplicitlyTypedLocalVariables
Page  16
8. Lambda expressions (람다 식) (1/3)
 Λ: 그리스 문자 중 11번째, 숫자 30을 의미
 람다 식
– 람다식은 대리자(delegate) 로 나타내거나 delegate로 컴파일 되는 식 트리(Expressions
Tree)로 나타낼 수 있음
 장점
– 코드의 간결성 => 가독성 증가 및 유지 보수 비용 감소
– 재활용 가능성 증가
– 지연 로딩(Lazy loading)으로 효율 증가
 단점
– 디버깅이 어려울 수 있음(Visual Studio는 타입 추론을 통하여 단점 완화)
– 남발할 경우 가독성 감소
“람다식, 또는 람다 함수는 프로그래밍 언어에서 사용되는 개념으로 익명 함수(Anonymous functions)를 지칭하는 용어이다.
프로그래밍 언어학적으로 파고들면 이것만 한 달 이상 배우는 경우도 많으며, 실제로 여러 대학들에서 사용하는 프로그래밍
언어 교재에서도 꽤나 많은 분량을 차지하는 개념이다. 실무적으로는 코드의 간결함, 지연 연산을 통한 퍼포먼스 향상,
그리고 기존 이터레이션 관련 코드를 구현하는 데 있어 불필요한 부분들을 제거할 수 있다는 점에서 비교적 중요하게
다루어지고 있다. 람다식은 주로 고차 함수에 인자(argument)로 전달되거나 고차 함수가 돌려주는 결과값으로 쓰인다”
참고: https://namu.wiki/w/람다식
Page  17
8. Lambda expressions (람다 식) (2/3)
 람다 선언 연산자 (=>)를 사용하여 매개변수 목록(좌)과 실행 코드(우)를
구분
– (input parameters) => expression
 매개 변수 0개
– () => 식 | { 실행 블록 }
• () => Console.WriteLine(“Run”);
 매개 변수 1개 (괄호 생략 가능)
– 매개 변수 명 => 식 | { 실행 블록 }
• x => x * x
 매개 변수 2개 이상
– (매개 변수 1, 매개 변수 2, …) => 식 | { 실행 블록 }
• (x, y) => x * y / 2
 변수 범위
– 식 외부 변수는 참조 가능, 내부 변수는 외부에서 참조 불가능
Page  18
8. Lambda expressions (람다 식) (3/3)
 주의사항
– 캡처된 변수는 해당 변수를 참조하는 대리자가 가비지 수집 대상이 될 때까지
가비지 수집되지 않음
– 람다 식에 사용된 변수는 외부 메서드에 표시되지 않음
– 람다 식은 바깥쪽 메서드에서 in, ref 또는 out 매개 변수를 직접 캡처할 수 없
음
– 람다 식의 return 문에 의해서는 바깥쪽 메서드가 반환되지 않음
– 점프문의 대상이 블록 외부에 있는 경우 람다 식에 람다 함수 내에 있는 goto
문, break 문 또는 continue 문을 포함할 수 없고, 대상이 블록 내에 있는 경우
람다 함수 블록 외부에 점프문을 사용하면 오류가 발생
Page  19
08_LambdaExpressions
Page  20
9. Extension methods (확장 메서드)
 클래스를 상속하지 않고 기존의 형식에 메서드를 추가할 수 있음
 정적 메서드 형태이지만 인스턴스의 메서드인 것처럼 호출됨
 호출하려는 형식의 인스턴스가 존재 해야 함
 확장 메서드가 존재하는 클래스의 네임스페이스(namespace)를 사용
(using 문에 포함) 해야 함
 Base 클래스가 있을 경우 클래스 상속을 이용할 수 있음
Page  21
09_ExtensionMethods
Page  22
10. Query expressions (쿼리 식) (1/2)
 SQL(Structured Query Language)과 유사한 구문으로 표현되는 쿼리
 IEnumerable<T> 또는 IQueryable<T> 구현한 컬렉션을 대상으로 함
 IQueryable<T> 을 구현한 컬렉션의 경우
구체화 하기 전에는 쿼리의 식 만을 저장하고 있어, 여러 쿼리 식을 한번
에 실행 할 수 있음
– 구체화 방법: ToList(), ToArray(), ToDictionary() …
 System.Linq.Ienumerable<T>의 확장 메서드로 100% 구현 가능
 SQL 문
– SELECT * FROM family AS p WHERE p.Age > 15 ORDER BY p.Name
 쿼리 식
– var persons = from p in family
where p.Age > 15
orderby p.Name
Page  23
10. Query expressions (쿼리 식) (2/2)
 시작: from 절
– Data Sourc의 대표 변수 선언
 종료: select, group 절
– Data 객체에서 구하고자 하는 값 지정
– group 절의 경우에는 into절을 사용하여 쿼리 임시 저장
 필터: where, join 절
– 하나의 소스(where) 또는 두개 이상의 소스에서 원하는 내용 필터링
 정렬: orderby <key>, orderby <key> descending
– Key에 의한 내림차순, 오름 차순 정렬
 하위 쿼리: 그룹화, 필터 등에서 하위 쿼리를 사용할 수 있음
Page  24
10_QueryExpressions
Page  25
11. LINQ (Language INtegrated Query: 링큐)
 단일 쿼리 식으로 다양한 Data Source에서 데이터 추출 구문을 생성하는
것
ADO.Net
XML
Object
쿼리 식
(확장 메서드)
Entity
Framework
LINQ to DataSet
LINQ to XML
LINQ to Object
LINQ to Entities
Page  26
11_Linq
Page  27
12. Extension methods Tips
 Enum의 값에서 설명 구하기
 KeyEqualityComparer<T> 클래스 활용
 String Extensions
 Type Extensions
 Generic Extensions
Page  28
12_ExtensionTips
Page  29
참고
 C#의 역사
https://docs.Microsoft.com/ko-kr/dotnet/csharp/whats-new/csharp-version-history
 C# 버전
http://www.csharpstudy.com/csharp/CSharp-version.aspx
 C# and .Net Version History
https://www.guru99.com/c-sharp-dot-net-version-history.html
 LINQ Tutorial
https://tutorialspoint.com/linq
 LINQ: .Net 통합 언어 쿼리
https://msdn.microsoft.com/ko-kr/library/bb308959.aspx
 쿼리 식 기본 사항
https://docs.microsoft.com/ko-kr/dotnet/csharp/linq/query-expression-basics
 식 트리
https://docs.microsoft.com/ko-kr/dotnet/csharp/expression-trees
 LINQ Pad
https://www.linqpad.net/
 ILSpy
https://github.com/icsharpcode/ILSpy
Page  30

More Related Content

What's hot

동작 파라미터와 람다 In java 8
동작 파라미터와 람다 In java 8동작 파라미터와 람다 In java 8
동작 파라미터와 람다 In java 8진우 이
 
C++ Advanced 강의 5주차
C++ Advanced 강의 5주차C++ Advanced 강의 5주차
C++ Advanced 강의 5주차HyunJoon Park
 
C++ Advanced 강의 3주차
C++ Advanced 강의 3주차C++ Advanced 강의 3주차
C++ Advanced 강의 3주차HyunJoon Park
 
자바8 람다식 소개
자바8 람다식 소개자바8 람다식 소개
자바8 람다식 소개beom kyun choi
 
Modern C++의 타입 추론과 람다, 컨셉
Modern C++의 타입 추론과 람다, 컨셉Modern C++의 타입 추론과 람다, 컨셉
Modern C++의 타입 추론과 람다, 컨셉HyunJoon Park
 
이것이 자바다 Chap. 6 클래스(CLASS)(KOR)
이것이 자바다 Chap. 6 클래스(CLASS)(KOR)이것이 자바다 Chap. 6 클래스(CLASS)(KOR)
이것이 자바다 Chap. 6 클래스(CLASS)(KOR)MIN SEOK KOO
 
공유 Jdk 7-2-project coin
공유 Jdk 7-2-project coin공유 Jdk 7-2-project coin
공유 Jdk 7-2-project coinknight1128
 
Start IoT with JavaScript - 1.기초
Start IoT with JavaScript - 1.기초Start IoT with JavaScript - 1.기초
Start IoT with JavaScript - 1.기초Park Jonggun
 
자바스크립트 함수
자바스크립트 함수자바스크립트 함수
자바스크립트 함수유진 변
 
델파이와 유니코드
델파이와 유니코드델파이와 유니코드
델파이와 유니코드Devgear
 
Windows reversing study_basic_5
Windows reversing study_basic_5Windows reversing study_basic_5
Windows reversing study_basic_5Jinkyoung Kim
 
Java 변수자료형
Java 변수자료형Java 변수자료형
Java 변수자료형Hyosang Hong
 
델파이 코딩 스타일과 아키텍처
델파이 코딩 스타일과 아키텍처델파이 코딩 스타일과 아키텍처
델파이 코딩 스타일과 아키텍처Devgear
 

What's hot (19)

동작 파라미터와 람다 In java 8
동작 파라미터와 람다 In java 8동작 파라미터와 람다 In java 8
동작 파라미터와 람다 In java 8
 
C++ Advanced 강의 5주차
C++ Advanced 강의 5주차C++ Advanced 강의 5주차
C++ Advanced 강의 5주차
 
C++ Advanced 강의 3주차
C++ Advanced 강의 3주차C++ Advanced 강의 3주차
C++ Advanced 강의 3주차
 
Java lambda
Java lambdaJava lambda
Java lambda
 
자바8 람다식 소개
자바8 람다식 소개자바8 람다식 소개
자바8 람다식 소개
 
Javascript
JavascriptJavascript
Javascript
 
15 swift 클래스
15 swift 클래스15 swift 클래스
15 swift 클래스
 
Modern C++의 타입 추론과 람다, 컨셉
Modern C++의 타입 추론과 람다, 컨셉Modern C++의 타입 추론과 람다, 컨셉
Modern C++의 타입 추론과 람다, 컨셉
 
17 swift 프로토콜
17 swift 프로토콜17 swift 프로토콜
17 swift 프로토콜
 
이것이 자바다 Chap. 6 클래스(CLASS)(KOR)
이것이 자바다 Chap. 6 클래스(CLASS)(KOR)이것이 자바다 Chap. 6 클래스(CLASS)(KOR)
이것이 자바다 Chap. 6 클래스(CLASS)(KOR)
 
공유 Jdk 7-2-project coin
공유 Jdk 7-2-project coin공유 Jdk 7-2-project coin
공유 Jdk 7-2-project coin
 
Java class
Java classJava class
Java class
 
Start IoT with JavaScript - 1.기초
Start IoT with JavaScript - 1.기초Start IoT with JavaScript - 1.기초
Start IoT with JavaScript - 1.기초
 
자바스크립트 함수
자바스크립트 함수자바스크립트 함수
자바스크립트 함수
 
델파이와 유니코드
델파이와 유니코드델파이와 유니코드
델파이와 유니코드
 
Windows reversing study_basic_5
Windows reversing study_basic_5Windows reversing study_basic_5
Windows reversing study_basic_5
 
Java 변수자료형
Java 변수자료형Java 변수자료형
Java 변수자료형
 
Java inner class
Java inner classJava inner class
Java inner class
 
델파이 코딩 스타일과 아키텍처
델파이 코딩 스타일과 아키텍처델파이 코딩 스타일과 아키텍처
델파이 코딩 스타일과 아키텍처
 

Similar to Linq

[15]Android Kotlin을 통한 개발 전략
[15]Android Kotlin을 통한 개발 전략[15]Android Kotlin을 통한 개발 전략
[15]Android Kotlin을 통한 개발 전략NAVER Engineering
 
C# 개요 및 소개 [ 유니티 및 C# 스터디 / 2024-04-19 ]
C# 개요 및 소개 [ 유니티 및 C# 스터디 / 2024-04-19 ]C# 개요 및 소개 [ 유니티 및 C# 스터디 / 2024-04-19 ]
C# 개요 및 소개 [ 유니티 및 C# 스터디 / 2024-04-19 ]leusin2
 
파이썬 namespace Binding 이해하기
파이썬 namespace Binding 이해하기 파이썬 namespace Binding 이해하기
파이썬 namespace Binding 이해하기 Yong Joon Moon
 
Java collections framework
Java collections frameworkJava collections framework
Java collections framework경주 전
 
Sonarqube 20160509
Sonarqube 20160509Sonarqube 20160509
Sonarqube 20160509영석 조
 
[114]angularvs react 김훈민손찬욱
[114]angularvs react 김훈민손찬욱[114]angularvs react 김훈민손찬욱
[114]angularvs react 김훈민손찬욱NAVER D2
 
[143] Modern C++ 무조건 써야 해?
[143] Modern C++ 무조건 써야 해?[143] Modern C++ 무조건 써야 해?
[143] Modern C++ 무조건 써야 해?NAVER D2
 
[HaU] 신입 기술 면접 준비 java
[HaU] 신입 기술 면접 준비 java[HaU] 신입 기술 면접 준비 java
[HaU] 신입 기술 면접 준비 java유리 하
 
Scala, Scalability
Scala, ScalabilityScala, Scalability
Scala, ScalabilityDongwook Lee
 
XECon2015 :: [2-1] 정광섭 - 처음 시작하는 laravel
XECon2015 :: [2-1] 정광섭 - 처음 시작하는 laravelXECon2015 :: [2-1] 정광섭 - 처음 시작하는 laravel
XECon2015 :: [2-1] 정광섭 - 처음 시작하는 laravelXpressEngine
 
처음 시작하는 라라벨
처음 시작하는 라라벨처음 시작하는 라라벨
처음 시작하는 라라벨KwangSeob Jeong
 
이펙티브 C++ (7~9)
이펙티브 C++ (7~9)이펙티브 C++ (7~9)
이펙티브 C++ (7~9)익성 조
 
자바 웹 개발 시작하기 (9주차 : 프로젝트 구현 – 추가적인 뷰)
자바 웹 개발 시작하기 (9주차 : 프로젝트 구현 – 추가적인 뷰)자바 웹 개발 시작하기 (9주차 : 프로젝트 구현 – 추가적인 뷰)
자바 웹 개발 시작하기 (9주차 : 프로젝트 구현 – 추가적인 뷰)DK Lee
 

Similar to Linq (20)

[15]Android Kotlin을 통한 개발 전략
[15]Android Kotlin을 통한 개발 전략[15]Android Kotlin을 통한 개발 전략
[15]Android Kotlin을 통한 개발 전략
 
C# 개요 및 소개 [ 유니티 및 C# 스터디 / 2024-04-19 ]
C# 개요 및 소개 [ 유니티 및 C# 스터디 / 2024-04-19 ]C# 개요 및 소개 [ 유니티 및 C# 스터디 / 2024-04-19 ]
C# 개요 및 소개 [ 유니티 및 C# 스터디 / 2024-04-19 ]
 
파이썬 namespace Binding 이해하기
파이썬 namespace Binding 이해하기 파이썬 namespace Binding 이해하기
파이썬 namespace Binding 이해하기
 
Java collections framework
Java collections frameworkJava collections framework
Java collections framework
 
Java script
Java scriptJava script
Java script
 
자바 8 학습
자바 8 학습자바 8 학습
자바 8 학습
 
Sonarqube 20160509
Sonarqube 20160509Sonarqube 20160509
Sonarqube 20160509
 
[114]angularvs react 김훈민손찬욱
[114]angularvs react 김훈민손찬욱[114]angularvs react 김훈민손찬욱
[114]angularvs react 김훈민손찬욱
 
Java8 람다
Java8 람다Java8 람다
Java8 람다
 
5.Spring IoC&DI(DI와 관련된 어노테이션)
5.Spring IoC&DI(DI와 관련된 어노테이션)5.Spring IoC&DI(DI와 관련된 어노테이션)
5.Spring IoC&DI(DI와 관련된 어노테이션)
 
[143] Modern C++ 무조건 써야 해?
[143] Modern C++ 무조건 써야 해?[143] Modern C++ 무조건 써야 해?
[143] Modern C++ 무조건 써야 해?
 
[HaU] 신입 기술 면접 준비 java
[HaU] 신입 기술 면접 준비 java[HaU] 신입 기술 면접 준비 java
[HaU] 신입 기술 면접 준비 java
 
Scalability
ScalabilityScalability
Scalability
 
Scala, Scalability
Scala, ScalabilityScala, Scalability
Scala, Scalability
 
9 swift 클로저1
9 swift 클로저19 swift 클로저1
9 swift 클로저1
 
Java(3/4)
Java(3/4)Java(3/4)
Java(3/4)
 
XECon2015 :: [2-1] 정광섭 - 처음 시작하는 laravel
XECon2015 :: [2-1] 정광섭 - 처음 시작하는 laravelXECon2015 :: [2-1] 정광섭 - 처음 시작하는 laravel
XECon2015 :: [2-1] 정광섭 - 처음 시작하는 laravel
 
처음 시작하는 라라벨
처음 시작하는 라라벨처음 시작하는 라라벨
처음 시작하는 라라벨
 
이펙티브 C++ (7~9)
이펙티브 C++ (7~9)이펙티브 C++ (7~9)
이펙티브 C++ (7~9)
 
자바 웹 개발 시작하기 (9주차 : 프로젝트 구현 – 추가적인 뷰)
자바 웹 개발 시작하기 (9주차 : 프로젝트 구현 – 추가적인 뷰)자바 웹 개발 시작하기 (9주차 : 프로젝트 구현 – 추가적인 뷰)
자바 웹 개발 시작하기 (9주차 : 프로젝트 구현 – 추가적인 뷰)
 

Linq

  • 1. C# 답게 쓰자 김 기 원 LINQ (Language-INtegrated Query)
  • 2. Page  2 Agenda 1. History of C# 2. Delegate 3. Action<T> 4. Func<T> 5. Anonymous methods 6. Implicitly typed local variables 7. Anonymous types 8. Lambda expressions 9. Extension methods 10. Query expressions 11. LINQ 12. Extension methods Tips
  • 3. Page  3 1. History of C# (1/2) Version .NET Framework Visual Studio Important Features C# 1.0 .NET Framework 1.0/1.1 Visual Studio .NET 2002 •Class / Structure / Interface •Event •Property •Delegate •Attribute C# 2.0 .NET Framework 2.0 Visual Studio 2005 •Generics •Partial types •Anonymous methods •Nullable types •Iterators •Covariance and contravariance C# 3.0 .NET Framework 3.03.5 Visual Studio 2008 •Auto-implemented properties •Anonymous types •Query expressions •Lambda expression •Expression trees •Extension methods •Object and collection initializer C# 4.0 .NET Framework 4.0 Visual Studio 2010 •Dynamic binding (dynamic) •Named/optional arguments •Generic covariant and contravariant •Embedded interop types
  • 4. Page  4 1. History of C# (2/2) Version .NET Framework Visual Studio Important Features C# 5.0 .NET Framework 4.5 Visual Studio 2012 /2013 •Asynchronous members (async/await) •Caller info attributes C# 6.0 .NET Framework 4.6 Visual Studio 2013 /2015 •Static imports •Exception filters •Property initializers •Expression bodied members •Null propagator •String interpolation •nameof operator •Dictionary initializer C# 7.0 7.1 7.2 7.3 .NET Core Visual Studio 2017 •Out variables(out int variable) •Named tuple •Pattern matching •Local function(anonymous method) •Expanded expressions bodies members •Ref locals and returns
  • 5. Page  5 2. Delegate  = Method signature  ≒ interface  Invoke, BeginInvoke 를 사용하여 호출할 수 있음  Method의 parameter로 전달할 수 있음  Class의 필드(field)나 속성(property)에 사용될 수 있음  Delegate를 할당(=), 추가(+=), 제거(-=) 할 수 있음  Event (=MulticastDelegate)
  • 7. Page  7 3. Action<in T>  매개변수가 1~16개이고 값을 반환하지 않는 메서드를 캡슐화 함  Mscorelib.dll  System.Core
  • 8. Page  8 4. Func<in T, out TResult>  매개변수가 0~16개이고 지정된 형식의 값을 반환하는 메서드를 캡슐화 함.  Mscorelib.dll  System.Core
  • 10. Page  10 5. Anonymous methods (무명 메서드)  C# 2.0 이전 버전의 delegate 사용은 명명된 메서드(named method) 만 을 사용  C# 2.0 에서는 무명 메서드(anonymous method)  C# 3.0 이상에서는 람다 식(Lambda Expressions)
  • 12. Page  12 6. Implicitly typed local variables (암시적 형식 지역 변수)  var (=variable) keyword  컴파일러가 적절한 형식을 결정  dynamic keyword 처럼 형식이 동적이지 않음  개발 편의를 위해 사용되는 keyword (사용하지 않을 경우 실제 클래스를 구현해야 함)  지역 변수로만 사용(형식을 알 수 있게 초기화 되어야 함)  클래스 범위의 필드에서는 사용할 수 없음  남용할 경우 코드 가독성 저하  Visual Studio의 Intellisense로 형식 유추 가능 [ ILSpy로 확인 ]
  • 13. Page  13 7. Anonymous types (무명 형식) (1/2)  명시적 형식을 정의할 필요가 없음  읽기 전용 속성 집합의 단일 개체로 캡슐화 할 수 있음  형식 이름은 컴파일러에 의해 생성되며 소스 수준에서는 사용할 수 없음  new 연산자를 개체 이니셜라이저(object initializer): new { }; 와 함께 사용 하여 생성  object 이외의 개체로는 캐스팅 (casting) 할 수 없음  필드(field), 속성(property) 이벤트(event), 메서드 반환 형식(method return type)은 선언할 수 없음  Visual Studio의 IIntellisense로 형식 유추 가능
  • 14. Page  14 7. Anonymous types (무명 형식) (2/2)  컴파일러가 내부적으로 형식을 생성함 [ ILSpy로 확인 ]
  • 16. Page  16 8. Lambda expressions (람다 식) (1/3)  Λ: 그리스 문자 중 11번째, 숫자 30을 의미  람다 식 – 람다식은 대리자(delegate) 로 나타내거나 delegate로 컴파일 되는 식 트리(Expressions Tree)로 나타낼 수 있음  장점 – 코드의 간결성 => 가독성 증가 및 유지 보수 비용 감소 – 재활용 가능성 증가 – 지연 로딩(Lazy loading)으로 효율 증가  단점 – 디버깅이 어려울 수 있음(Visual Studio는 타입 추론을 통하여 단점 완화) – 남발할 경우 가독성 감소 “람다식, 또는 람다 함수는 프로그래밍 언어에서 사용되는 개념으로 익명 함수(Anonymous functions)를 지칭하는 용어이다. 프로그래밍 언어학적으로 파고들면 이것만 한 달 이상 배우는 경우도 많으며, 실제로 여러 대학들에서 사용하는 프로그래밍 언어 교재에서도 꽤나 많은 분량을 차지하는 개념이다. 실무적으로는 코드의 간결함, 지연 연산을 통한 퍼포먼스 향상, 그리고 기존 이터레이션 관련 코드를 구현하는 데 있어 불필요한 부분들을 제거할 수 있다는 점에서 비교적 중요하게 다루어지고 있다. 람다식은 주로 고차 함수에 인자(argument)로 전달되거나 고차 함수가 돌려주는 결과값으로 쓰인다” 참고: https://namu.wiki/w/람다식
  • 17. Page  17 8. Lambda expressions (람다 식) (2/3)  람다 선언 연산자 (=>)를 사용하여 매개변수 목록(좌)과 실행 코드(우)를 구분 – (input parameters) => expression  매개 변수 0개 – () => 식 | { 실행 블록 } • () => Console.WriteLine(“Run”);  매개 변수 1개 (괄호 생략 가능) – 매개 변수 명 => 식 | { 실행 블록 } • x => x * x  매개 변수 2개 이상 – (매개 변수 1, 매개 변수 2, …) => 식 | { 실행 블록 } • (x, y) => x * y / 2  변수 범위 – 식 외부 변수는 참조 가능, 내부 변수는 외부에서 참조 불가능
  • 18. Page  18 8. Lambda expressions (람다 식) (3/3)  주의사항 – 캡처된 변수는 해당 변수를 참조하는 대리자가 가비지 수집 대상이 될 때까지 가비지 수집되지 않음 – 람다 식에 사용된 변수는 외부 메서드에 표시되지 않음 – 람다 식은 바깥쪽 메서드에서 in, ref 또는 out 매개 변수를 직접 캡처할 수 없 음 – 람다 식의 return 문에 의해서는 바깥쪽 메서드가 반환되지 않음 – 점프문의 대상이 블록 외부에 있는 경우 람다 식에 람다 함수 내에 있는 goto 문, break 문 또는 continue 문을 포함할 수 없고, 대상이 블록 내에 있는 경우 람다 함수 블록 외부에 점프문을 사용하면 오류가 발생
  • 20. Page  20 9. Extension methods (확장 메서드)  클래스를 상속하지 않고 기존의 형식에 메서드를 추가할 수 있음  정적 메서드 형태이지만 인스턴스의 메서드인 것처럼 호출됨  호출하려는 형식의 인스턴스가 존재 해야 함  확장 메서드가 존재하는 클래스의 네임스페이스(namespace)를 사용 (using 문에 포함) 해야 함  Base 클래스가 있을 경우 클래스 상속을 이용할 수 있음
  • 22. Page  22 10. Query expressions (쿼리 식) (1/2)  SQL(Structured Query Language)과 유사한 구문으로 표현되는 쿼리  IEnumerable<T> 또는 IQueryable<T> 구현한 컬렉션을 대상으로 함  IQueryable<T> 을 구현한 컬렉션의 경우 구체화 하기 전에는 쿼리의 식 만을 저장하고 있어, 여러 쿼리 식을 한번 에 실행 할 수 있음 – 구체화 방법: ToList(), ToArray(), ToDictionary() …  System.Linq.Ienumerable<T>의 확장 메서드로 100% 구현 가능  SQL 문 – SELECT * FROM family AS p WHERE p.Age > 15 ORDER BY p.Name  쿼리 식 – var persons = from p in family where p.Age > 15 orderby p.Name
  • 23. Page  23 10. Query expressions (쿼리 식) (2/2)  시작: from 절 – Data Sourc의 대표 변수 선언  종료: select, group 절 – Data 객체에서 구하고자 하는 값 지정 – group 절의 경우에는 into절을 사용하여 쿼리 임시 저장  필터: where, join 절 – 하나의 소스(where) 또는 두개 이상의 소스에서 원하는 내용 필터링  정렬: orderby <key>, orderby <key> descending – Key에 의한 내림차순, 오름 차순 정렬  하위 쿼리: 그룹화, 필터 등에서 하위 쿼리를 사용할 수 있음
  • 25. Page  25 11. LINQ (Language INtegrated Query: 링큐)  단일 쿼리 식으로 다양한 Data Source에서 데이터 추출 구문을 생성하는 것 ADO.Net XML Object 쿼리 식 (확장 메서드) Entity Framework LINQ to DataSet LINQ to XML LINQ to Object LINQ to Entities
  • 27. Page  27 12. Extension methods Tips  Enum의 값에서 설명 구하기  KeyEqualityComparer<T> 클래스 활용  String Extensions  Type Extensions  Generic Extensions
  • 29. Page  29 참고  C#의 역사 https://docs.Microsoft.com/ko-kr/dotnet/csharp/whats-new/csharp-version-history  C# 버전 http://www.csharpstudy.com/csharp/CSharp-version.aspx  C# and .Net Version History https://www.guru99.com/c-sharp-dot-net-version-history.html  LINQ Tutorial https://tutorialspoint.com/linq  LINQ: .Net 통합 언어 쿼리 https://msdn.microsoft.com/ko-kr/library/bb308959.aspx  쿼리 식 기본 사항 https://docs.microsoft.com/ko-kr/dotnet/csharp/linq/query-expression-basics  식 트리 https://docs.microsoft.com/ko-kr/dotnet/csharp/expression-trees  LINQ Pad https://www.linqpad.net/  ILSpy https://github.com/icsharpcode/ILSpy

Editor's Notes

  1. 1