powerpoint...

79

Upload: others

Post on 01-Mar-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를
Page 2: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

2013.12

C# 5.0

Page 3: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 5.0

1/ C#과닷넷프레임워크

2/ C# 2.0, 3.0, 4.0, 5.0 정리

3/ 정리및Q&A

Page 4: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C#과닷넷프레임워크 – CIL (1)

(Common) Intermediate Language

IL

C#

기계어

C++

Managed Native

Page 5: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C#과닷넷프레임워크 – CIL (2)

HelloWorld의 C# / IL 언어using System;

namespace ConsoleApplication1{

class Program{

static void Main(string[] args){

Console.WriteLine("Hello World");}

}}

.assembly extern mscorlib{.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ).ver 4:0:0:0

}.assembly helloworld{.custom instance void

[mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 ) .custom instance void [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() =

( 01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78

63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 ) .hash algorithm 0x00008004.ver 0:0:0:0

}.module helloworld.exe

.imagebase 0x00400000

.file alignment 0x00000200

.stackreserve 0x00100000

.subsystem 0x0003

.corflags 0x00000001

.class private auto ansi beforefieldinit ConsoleApplication1.Programextends [mscorlib]System.Object

{.method private hidebysig static void Main(string[] args) cil managed{

.entrypoint

.maxstack 8IL_0000: nopIL_0001: ldstr "Hello World"IL_0006: call void [mscorlib]System.Console::WriteLine(string)IL_000b: nopIL_000c: ret

}

.method public hidebysig specialname rtspecialname instance void .ctor() cil managed

{.maxstack 8IL_0000: ldarg.0IL_0001: call instance void [mscorlib]System.Object::.ctor()IL_0006: ret

}}

Page 6: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C#과닷넷프레임워크 – CIL (3)

닷넷언어를만드는 2가지방법

1. 소스코드 CLI표준에정의된바이너리를직접생성

2. 소스코드 IL 언어 ilasm.exe를이용해서 CLI 표준에정의된바이너리를생성

Page 7: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C#과닷넷프레임워크 – CIL (4)

IL에서만가능한표현

표현 IL C# VB.NET

리턴값에따른메서드오버로드 O X X

[protected and internal] 접근자 O X X

struct에서인자없는생성자정의 O X X

Page 8: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C#과닷넷프레임워크 –컴파일 (1)

두번의컴파일

C# 소스코드중간언어(Intermediate Language) 기계어

C# 컴파일러 JIT 컴파일러

릴리즈디버그 릴리즈디버그

Page 9: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C#과닷넷프레임워크 –컴파일 (2)

언어컴파일러

생산된 IL만올바르다면언어의문법은자유롭게확장가능

ex) VB.NET 의 Module에정의되는전역변수

JIT 컴파일러

실행시 IL 코드를 Debug / Release 모드에따라기계어로변환

ex) Field로정의하면 Property get/set으로정의하는것보다빠른가?

ex) 무한재귀호출이항상 StackOverflowException을발생할까?

Page 10: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C#과닷넷프레임워크 –버전

C#과닷넷프레임워크버전관계

닷넷버전 C# 버전 주요특징

1.0 ~ 1.1 1.0 C# 1.0

2.0 2.0 Generics

3.0 ~ 3.5 3.0 LINQ

4.0 4.0 dynamic예약어

4.5 5.0 async/await 예약어

Page 11: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 언어의발전요소

• CLR – 2.0(4.0) 신규 IL

• BCL (Base Class Library)

• 언어표현- Syntactic Sugar (단축표기)

- 기존의 IL 표현력추가

IL BCL 언어표현

- - -

Page 12: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 5.0

1/ C#과닷넷프레임워크

2/ C# 2.0, 3.0, 4.0, 5.0 정리

3/ 정리및Q&A

Page 13: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 1.0

• VM 언어지만 Interop을고려 PInvoke, unsafe(pointer), delegate

ex) CPU 기계어코드를호출할수있을까?#include "stdafx.h"

void getCpuId(int bits[]){

_asm{

xor ebx, ebx;xor ecx, ecx;xor edx, edx;

mov eax, 0;

cpuid;

mov edi, bits;

mov dword ptr [edi + 0], eax;mov dword ptr [edi + 4], ebx;mov dword ptr [edi + 8], ecx;mov dword ptr [edi + 12], edx;

}}

int _tmain(int argc, _TCHAR* argv[]){

int bits[4];

getCpuId(bits); printf("%x, %x, %x, %x\n", bits[0], bits[1], bits[2], bits[3]);

return 0;}

Page 14: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 2.0

• ?? 연산자• yield return/break

• partial class

• anonymous method

• static class

• 제네릭(Generics)

• Nullable

Page 15: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 2.0 - ?? 연산자

IL BCL 언어표현

- - O

string txt = null;

if (txt == null){

Console.WriteLine("(null)");}else{

Console.WriteLine(txt);}

string txt = null;Console.WriteLine(txt ?? "(null)");

Page 16: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 2.0 – yield return/break (1)

• IEnumerable의단축표기

F# C# 주요특징

list IList, ICollection 요소의전체목록을보유

sequence IEnumerable 필요한순간에요소의값을계산

IL BCL 언어표현

- - O

Page 17: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 2.0 – yield return/break (2)

• IList / ICollection

public class ListNatural{

ArrayList GetNumbers(int max){

ArrayList list = new ArrayList();

for (int i = 1; i <= max; i++){

list.Add(i);}

return list;}

}

Page 18: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 2.0 – yield return/break (3)

• IEnumerablepublic class SequenceNatural : IEnumerable, IEnumerator{

int _current;

public IEnumerator GetEnumerator(){

_current = 0;return this;

}

public object Current{

get { return _current; }}

public bool MoveNext(){

_current++;return true;

}

public void Reset(){

_current = 0;}

}

Page 19: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 2.0 – yield return/break (3)

• yield return/break

public class YieldNatural{

public IEnumerable GetNumbers(){

int n = 1;while (true){

yield return n;

// if (n == 100) yield break;n++;

}}

}

Page 20: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 2.0 – partial type (1)

• 클래스의구현을 2개이상으로분리

IL BCL 언어표현

- - O

partial class MyClass{

public void Do(){

Console.Write(_number);}

}

partial class MyClass{

private int _number = 1;}

partial class MyClass{

public void Do(){

Console.Write(_number);}

private int _number = 1;}

Page 21: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 2.0 – partial type (2)

• 자동코드생성의문제점해결!- Visual Studio 2002/2003 2005

• F#은 WPF를왜지원하지않는가?

Page 22: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 2.0 –익명메서드 (1)

• 이름없는메서드정의가능

IL BCL 언어표현

- - O

static void Main(string[] args){

Thread t = new Thread(func);t.Start();

}

private static void func(object obj){

Console.Write("...");}

static void Main(string[] args){

Thread t = new Thread(delegate (object obj){

Console.Write("...");}

);

t.Start();}

Page 23: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 2.0 –익명메서드 (2)

using System;

namespace ConsoleApplication1{

class Program{

delegate void Functor(object obj);

static void Main(string[] args){

Functor logOutput = delegate(object obj) { Console.Write(obj); };

logOutput("test");}

}}

• delegate 타입의인자로 인라인메서드정의

Page 24: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 2.0 –익명메서드 (3)

• 이벤트처리기

this.textBox1.TextChanged += delegate (object sender, EventArgs e) {

Console.WriteLine(“Do!”);};

// 또는 delegate의 인자를 사용하지 않는다면 생략 가능

this.textBox1.TextChanged += delegate { Console.WriteLine(“Do!”); };

Page 25: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 2.0 – static class

• IL 코드표현: 상속불가능한 추상클래스• C# 컴파일러: 인스턴스 멤버정의불가능

IL BCL 언어표현

- - O

abstract class AbstractClass {}

static class StaticClass{}

.class private abstract auto ansi beforefieldinit AbstractClassextends [mscorlib]System.Object

{.method family hidebysig specialname rtspecialname instance

void .ctor() cil managed{}

}

.class private abstract auto ansi sealed beforefieldinit StaticClass

extends [mscorlib]System.Object{}

Page 26: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 2.0 –제네릭 (1)

• C++의 template과 유사

IL BCL 언어표현

O - -

public class NewStack<T>{

T [] _objList;int _pos;

public NewStack(int size){

_objList = new T[size];}

public void Push(T newValue){

_objList[_pos] = newValue;_pos++;

}

public T Pop(){

_pos--;return _objList[_pos];

}}

Page 27: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 2.0 –제네릭 (2)

• 메서드수준의 제네릭도지원

public class LogOutput{

public void Output<T,V>(T value1, V value2){

Console.WriteLine(value1 + “: ” + value2);}

}

Page 28: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 2.0 –제네릭 (3)

• 박싱/언박싱 문제를 해결

ArrayList list = new ArrayList();list.Add(5); // void Add(object value)list.Add(6);

List<int> list = new List<int>();list.Add(5); // void Add(T item)list.Add(6); // void Add(int item);

Page 29: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 2.0 –제네릭 (4)

• 제약 1 – 상속타입

public static T Max<T>(T item1, T item2) where T : IComparable{

if (item1.CompareTo(item2) >= 0){

return item1;}

return item2;}

Page 30: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 2.0 –제네릭 (5)

• 제약 2 – 값/참조 타입

public static void Print<T,V>(T item1, V item2) where T : structwhere V : class

{Console.WriteLine(item1);

if (item2 != null) // 값 형식인 item1과 비교한다면 컴파일 에러{

Console.WriteLine(item2);}

}

Page 31: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 2.0 –제네릭 (6)

• 제약 3 – 인자없는생성자 필수

public static T AllocateIfNull<T>(T item) where T : class, new(){

if (item == null){

item = new T();}

return item;}

Page 32: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 2.0 –제네릭 (7)

• 기존컬렉션의 제네릭버전제공

.NET 1.x 컬렉션 대응되는제네릭버전의컬렉션

ArrayList List<T>

Hashtable Dictionary<TKey, TValue>

SortedList SortedDictionary<TKey, TValue>

Stack Stack<T>

Queue Queue<T>

Page 33: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 2.0 – Nullable 타입

• .NET 2.0 BCL: Nullable<T> 구조체 추가• C#의경우 T? 형태로 단축표기

IL BCL 언어표현

- O O

int? value1 = null; // Nullable<int> value1;short? value2 = 5; // Nullable<short> value2;

if (value1.HasValue){

Console.WriteLine(value1);}

Console.WriteLine(value2); // Console.WriteLine(value2.Value);

Page 34: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 5.0

1/ C#과닷넷프레임워크

2/ C# 2.0, 3.0, 4.0, 5.0 정리

3/ 정리및Q&A

Page 35: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 3.0

• 자동구현속성• 컬렉션초기화• LINQ

var

객체초기화 익명타입 확장메서드 람다식

Page 36: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 3.0 –자동구현속성 (1)

• Field + Property 구현을단순화

IL BCL 언어표현

- - O

class Person{

string _name;public string Name{

get { return _name; }set { _name = value; }

}

int _age;public int Age{

get { return _age; }set { _age = value; }

}}

public string Name { get; set; }public int Age { get; set; }

Page 37: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 3.0 –자동구현속성 (2)

• get/set의접근제한자

class Person{

public string Name{

get; protected set;

}

public int Age{

get; private set;

}}

Page 38: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 3.0 –컬렉션초기화

• ICollection 인터페이스를 구현한타입• 컬렉션의 요소를 new 구문에서 추가

IL BCL 언어표현

- - O

List<int> numbers = new List<int>();

numbers.Add(0);numbers.Add(1);numbers.Add(2);numbers.Add(3);numbers.Add(4);

List<int> numbers = new List<int> { 0, 1, 2, 3, 4 };

Page 39: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 3.0 – LINQ

• 발음: LINK? LIN-Q?

둘다옳다.

“Moq”도 “mock”으로발음하기도하지만 “mock u”로발음하는것처럼,

일반적으로 “link”라고발음하지만 “link u”로발음하기도함.

주의사항: FAQ에대해서까지이규칙을적용해서는안됨

(출처: http://stackoverflow.com/questions/2659330/how-to-pronounce-linq)

Page 40: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 3.0 – LINQ (1)

• LINQ: Language-INtegrated Query

언어에통합된쿼리표현식(Query Expressions)

List<Person> people = new List<Person>{

new Person { Name = "Anders", Age = 47, Married = true },new Person { Name = "Hans", Age = 25, Married = false },

};

IEnumerable<Person> all = from person in peopleselect person;

foreach (Person item in all){

Console.WriteLine(item);} IL BCL 언어표현

- O O

Page 41: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 3.0 – LINQ (2)

• SQL 쿼리의 SELECT와유사

방식 코드

SQL SELECT * FROM people

LINQIEnumerable<Person> all = from person in people

select person;

메서드

IEnumerable<Person> SelectFunc(List<Person> people){foreach (Person item in people){yield return item;

}}

Page 42: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 3.0 – var 예약어

• 컴파일러가 로컬변수의형식을 추론• C++ 11의 auto 예약어와동격

IEnumerable<Person> all = from person in peopleselect person;

var all = from person in peopleselect person;

foreach (var item in all){

Console.WriteLine(item);}

IL BCL 언어표현

- - O

Page 43: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 3.0 –객체초기화 (1)

• 공용속성을통해객체생성시에초기화class Person{

public string Name { get; set; }public int Age { get; set; }

}

Person p1 = new Person();p1.Name = “Hans”;p1.Age = 30;

Person p2 = new Person { Name = "Tom", Age = 29 };

IL BCL 언어표현

- - O

Page 44: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 3.0 –객체초기화 (2)

• SELECT * FROM people

SELECT Name, Age FROM people

SELECT Name, Married FROM people

var all = from person in peopleselect person;

var all = from person in peopleselect new Person { Name = person.Name, Age = person.Age };

var all = from person in peopleselect new Person { Name = person.Name,

Married = person.Married };

Page 45: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 3.0 –객체초기화 (4)

• 컬렉션초기화 + 객체초기화

List<Person> list = new List<Person>{

new Person { Name = "Ally", Age = 35 },new Person { Name = "Luis", Age = 40 },

};

Page 46: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 3.0 –익명타입 (1)

• 이름없는타입

내부적인처리는익명메서드와유사

• var 사용은 필수

var p = new { Count = 10, Title = "Anders" };

Console.WriteLine(p.Title + ": " + p.Count);

IL BCL 언어표현

- - O

Page 47: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 3.0 –익명타입 (2)

• LINQ - SELECT

var all = from person in peopleselect new { Name = person.Name, Age = person.Age };

var all = from person in peopleselect new { Name = person.Name,

Married = person.Married };

foreach (var item in all){

Console.WriteLine(item);}

Page 48: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 3.0 –익명타입 (3)

• SELECT p.Name, p.Age, lang.Language

FROM people as p

INNER JOIN Language as lang

ON p.Name = lang.Name

var all = from p in people

join lang in languages on p.Name equals lang.Name

select new { Name = p.Name, Age = p.Age, Language = lang.Language };

foreach (var item in all){

Console.WriteLine(item);}

Page 49: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 3.0 –확장메서드 (1)

• 정적메서드를 마치인스턴스메서드처럼 사용

IL BCL 언어표현

- - O

class Program{

static void Main(string[] args){

string txt = "http://www.naver.com";

string contents = txt.TextFromUrl();Console.WriteLine(contents);

}}

static class StringExtension{

public static string TextFromUrl(this string txt){

WebClient wc = new WebClient();return wc.DownloadString(txt);

}}

Page 50: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 3.0 –확장메서드 (2)

• 결국정적메서드호출

class Program{

static void Main(string[] args){

string txt = "http://www.naver.com";

string contents = StringExtension.TextFromUrl(txt);Console.WriteLine(contents);

}}

static class StringExtension{

public static string TextFromUrl(string txt){

WebClient wc = new WebClient();return wc.DownloadString(txt);

}}

Page 51: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 3.0 –확장메서드 (3)

• 쿼리구문과메서드 기반구문

var all = from p in peopleselect p;

var all = people.Select(delegate(Person p) { return p; });

var all = from p in peopleselect new { Name = p.Name, Age = p.Age };

var all = people.Select(delegate(Person p){

return new { Name = p.Name, Age = p.Age };});

Page 52: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 3.0 –확장메서드 (4)

• SELECT * FROM people WHERE Age >= 30

var all = from p in peoplewhere p.Age >= 30select p;

var all = people.Where (delegate(Person p) { return p.Age >= 30; }).Select(delegate(Person p) { return p; });

Page 53: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 3.0 –확장메서드 (5)

• SELECT * FROM people ORDER BY Age

var all = people.OrderBy(delegate(Person p) { return p.Age; }).Select (delegate(Person p) { return p; });

var all = from p in peopleorderby p.Ageselect p;

Page 54: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 3.0 –람다식 (1)

• 추론을통해 delegate 익명메서드를 개선

IL BCL 언어표현

- - O

delegate void Functor(object obj);

Functor logOutput = delegate(object obj) { Console.Write(obj); };

Functor logLambda = (obj) => { Console.Write(obj); };

Page 55: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 3.0 –람다식 (2)

• 값반환+단문메서드 return+중괄호 생략

delegate int Calc(int v1, int v2);

Calc addFunc = (v1, v2) => { return v1 + v2; };

Calc addLambda = (v1, v2) => v1 + v2;

Page 56: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 3.0 –람다식 (3)

• 메서드기반쿼리를 단순화

var all = people.Select(p => p);

var all = people.Select(p => new { Name = p.Name, Age = p.Age });

var all = people.Select(delegate(Person p) { return p; });

var all = people.Select(delegate(Person p){

return new { Name = p.Name, Age = p.Age };});

Page 57: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 3.0 –람다식 (4)

• 데이터로써의 람다 Expression Tree

[데이터]

Expression<Func<int, int, int>> exp = (a, b) => a + b;

[mscorlib 어셈블리]public delegate TResult Func<T1, T2, TResult>(T1 arg1, T2 arg2)

[코드]

Func<int, int, int> exp = (a, b) => a + b;

Page 58: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 3.0 –람다식 (5)

• Expression Tree

// 람다 식 본체의 루트는 2항 연산자인 + 기호BinaryExpression opPlus = exp.Body as BinaryExpression;Console.Write(opPlus.NodeType); // 출력: Add

// 2항 연산자의 좌측 연산자의 표현식ParameterExpression left = opPlus.Left as ParameterExpression;Console.Write(left.NodeType + ": " + left.Name); // 출력: Parameter: a

// 2항 연산자의 우측 연산자의 표현식ParameterExpression right = opPlus.Right as ParameterExpression;Console.Write(right.NodeType + ": " + right.Name); // 출력: Parameter: b

Page 59: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 3.0 –람다식 (6)

• Expression Tree 컴파일

Expression<Func<int, int, int>> exp = (a, b) => a + b;

var addFunc = exp.Compile();

Console.WriteLine(addFunc(5, 6));

Page 60: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 3.0 –람다식 (7)

• 사례 1) SQL 쿼리를생성

Expression<Func<IOrderedEnumerable<Person>>> func =() => from p in people

orderby p.Age descendingselect p;

SELECT * FROM people ORDER BY Age DESC

Page 61: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 3.0 –람다식 (8)

• 사례 2) 공용속성이름private int age = 0;public int Age{

get{

return age;}set{

age = value;OnPropertyChanged(() => this.Age); // OnPropertyChanged(“Age”);

}}

public event PropertyChangedEventHandler PropertyChanged;

public void OnPropertyChanged<TValue>(Expression<Func<TValue>> propertySelector){

if (PropertyChanged != null){

var memberExpression = propertySelector.Body as MemberExpression;if (memberExpression != null){

PropertyChanged(this, new PropertyChangedEventArgs(memberExpression.Member.Name));}

}}

Page 62: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 3.0 – LINQ 정리

• LINQ to …

• 표준쿼리연산자

Page 63: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 5.0

1/ C#과닷넷프레임워크

2/ C# 2.0, 3.0, 4.0, 5.0 정리

3/ 정리및Q&A

Page 64: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 4.0 –선택적매개변수

• 선택적매개변수• 명명된인자• dynamic

Page 65: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 4.0 –선택적매개변수 (1)

• C++의디폴트매개변수class Person{

public void Output(string name, int age = 0, string address = "Korea"){

Console.Write(string.Format("{0}: {1} in {2}", name, age, address));}

}

class Program{

static void Main(string[] args){

Person p = new Person();

p.Output("Anders");p.Output("Winnie", 36);p.Output("Tom", 28, "Tibet");

}}

IL BCL 언어표현

O - -

Page 66: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 4.0 –선택적매개변수 (2)

• 확장된 IL 구문

.method public hidebysig instance void Output(string name,[opt] int32 age, [opt] string address) cil managed

{.param [2] = int32(0x00000000).param [3] = "Korea"

.maxstack 8IL_0000: nop...[생략]…IL_0019: ret

}

Page 67: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 4.0 –명명된인자

• 인자의이름으로호출측에서값전달

IL BCL 언어표현

- - O

class Person{

public void Output(string name, int age = 0, string address = "Korea"){

Console.Write(string.Format("{0}: {1} in {2}", name, age, address));}

}

class Program{

static void Main(string[] args){

Person p = new Person();

p.Output(address: "Tibet", name: "Tom");p.Output(age: 5, name: "Tom", address: "Tibet");p.Output(name: "Tom");

}}

Page 68: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 4.0 – dynamic (1)

• 실행시에결정되는타입

IL BCL 언어표현

- O O

using System;

namespace ConsoleApplication1{

class Program{

static void Main(string[] args){

dynamic d = 5;

int sum = d + 10;Console.WriteLine(sum);

}}

}

Page 69: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 4.0 – dynamic (2)

• 결국은 object 타입using System;using System.Runtime.CompilerServices;using Microsoft.CSharp.RuntimeBinder;

class Program{

public static CallSite<Action<CallSite, object>> p__Site1;

static void Main(){

object d = 5;

if (p__Site1 == null){

p__Site1 = CallSite<Action<CallSite, object>>.Create(Binder.InvokeMember(CSharpBinderFlags.ResultDiscarded,

"CallTest", null, typeof(Program),new CSharpArgumentInfo[] {

CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null)}));

}p__Site1.Target(p__Site1, d);

}}

static void Main(){

dynamic d = 5;

d.CallTest();}

Page 70: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 4.0 – dynamic (3)

• IronPython과 C#

using System;using IronPython.Hosting;

class Program{

static void Main(string[] args){

var scriptEngine = Python.CreateEngine();

string code = @"print 'Hello Python'";

scriptEngine.Execute(code);// 'Hello Python' 문자열 출력

}}

1. NuGet 콘솔을열고,2. “Install-Package IronPython” 명령어실행

Page 71: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 4.0 – dynamic (4)

• C#에서 IronPython 메서드연동

using System;using IronPython.Hosting;

class Program{

static void Main(string[] args){

var scriptEngine = Python.CreateEngine();

var scriptScope = scriptEngine.CreateScope();

string code = @"def AddFunc(a, b):

print 'AddFunc called'

return (a + b)";

scriptEngine.Execute(code, scriptScope);

dynamic addFunc = scriptScope.GetVariable("AddFunc");int nResult = addFunc(5, 10);

Console.WriteLine(nResult);}

}

Page 72: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 4.0 – dynamic (5)

• IronPython에서 C# 메서드연동using System;using System.Collections.Generic;using IronPython.Hosting;

class Program{

static void Main(string[] args){

var scriptEngine = Python.CreateEngine();var scriptScope = scriptEngine.CreateScope();

List<string> list = new List<string>();scriptScope.SetVariable("myList", list);

string code = @"myList.Add('my')myList.Add('python')";

scriptEngine.Execute(code, scriptScope);

foreach (var item in list){

Console.WriteLine(item);}

}}

Page 73: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 5.0

1/ C#과닷넷프레임워크

2/ C# 2.0, 3.0, 4.0, 5.0정리

3/ 정리및Q&A

Page 74: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 5.0 –호출자정보

• C++의 3가지매크로상수에대응__FUNCTION__, __FILE__, __LINE__,

using System;using System.Runtime.CompilerServices;

class Program{

static void Main(string[] args){

LogMessage("테스트 로그");}

static void LogMessage(string text,[CallerMemberName] string member = "",[CallerFilePath] string file = "",

[CallerLineNumber] int line = 0){

Console.WriteLine("텍스트: " + text);Console.WriteLine("호출한 메서드 이름: " + member);

Console.WriteLine("호출한 소스코드의 파일명: " + file);Console.WriteLine("호출한 소스코드의 라인번호: " + line);

}}

IL BCL 언어표현

- O O

Page 75: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 5.0 – async/await (1)

• 마치동기방식처럼비동기호출private static async void AwaitRead(){

using (FileStream fs = new FileStream(@"…", FileMode.Open)){

byte[] buf = new byte[fs.Length];

await fs.ReadAsync(buf, 0, buf.Length);

string txt = Encoding.UTF8.GetString(buf);Console.WriteLine(txt);

}}

IL BCL 언어표현

- O O

static void Main(string[] args){

AwaitRead()Console.ReadLine();

}

Page 76: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 5.0 – async/await (2)

• 비동기호출시스레드상태

Page 77: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 5.0 – async/await (3)

• 사용자정의 …Async 메서드

private static async void FileReadAsync(string filePath){

string fileText = await ReadAllTextAsync(filePath);Console.WriteLine(fileText);

}

static Task<string> ReadAllTextAsync(string filePath){

return Task.Factory.StartNew(() =>{

return File.ReadAllText(filePath);});

}

Page 78: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

C# 5.0

1/ C#과닷넷프레임워크

2/ C# 2.0, 3.0, 4.0, 5.0 정리

3/ 정리및Q&A

Page 79: PowerPoint Presentationdownload.microsoft.com/download/A/6/3/A6318FDA-5AA6-4C56...C#과닷넷프레워크 –CIL (3) 닷넷언어를만드는2가지방법 1. 소스코드 CLI 표준에정의된바이너를

정리

방식 수

신규 IL 2

BCL확장 5

언어확장 18

• 단축표기법

• C# 6.0?

• Roslyn?