The Evolution of C# Part-I

2,823 views

Published on

사내 C# 세미나 Part-I 슬라이드입니다.
데모 코드는 https://github.com/gyuwon/csharp-seminar-demos/ 에 있습니다.

1.0
- System.Object
- Stack & Heap
- Value Type & Reference Type
- Boxing & Unboxing
- Reference Type 추가 메모리 사용
- Delegates & Events
- Interface 명시적 구현

2.0
- Generic
- Anonymous Methods
- Iterator Methods
- Nullable<>

Published in: Technology
0 Comments
13 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,823
On SlideShare
0
From Embeds
0
Number of Embeds
1,271
Actions
Shares
0
Downloads
32
Comments
0
Likes
13
Embeds 0
No embeds

No notes for slide

The Evolution of C# Part-I

  1. 1. The Evolution of C# 버전 별 주요 특징 이규원
  2. 2. 본 세미나의 목적 • C# 주요 변화과정 둘러보기 • Remind • 가려운 곳 긁기 • 2%
  3. 3. 본 세미나에서 다루는 것들 • C# 언어의 버전 별 발전 과정 • C# 언어와 밀접한 .NET Framework 특징 • C# 언어에 영향을 준 프로그래밍 언어들과의 비교
  4. 4. 본 세미나에서 다루지 않는 것들 • C# 언어의 기초적인 문법(if, foreach, using, try, lock, …) • C# 언어와 직접적으로 관련되지 않은 .NET Framework 특징 • C# 언어와 직접적으로 관련되지 않은 프레임워크(TPL, WCF, Entity Framework, …) • 응용프로그램 플랫폼(WPF, ASP.NET, …)
  5. 5. 발표자 • • • • • • • • • • 프로그래머 통계학 학사, 숭실대 (`97~`05) Visual Studio의 노예 현 프리랜서 위대한 ESM팀 소속 1989년 BASIC 입문 on Apple IIe 1991년 C 입문 on 8086 1992년 음주 입문 1997년 C++ & Java 입문 2005년 C# 입문 gyuwon@live.com http://justhackem.wordpress.com http://facebook.com/gyuwon.yi
  6. 6. Keywords 1.0 • Managed 2.0 • Generic 4.0 • Dynamic 5.0 • Async 3.0 • Linq
  7. 7. 1.0 Managed Value Type vs. Reference Type Delegate and Event
  8. 8. System.Object • 모든 클래스, 구조체, 열거형, 대리자의 상위 형식 Object Int32 ValueType String Double Enum Attribute DateTime TypeCode Exception Delegate
  9. 9. System.Object 멤버 public virtual int GetHashCode() public virtual string ToString() public virtual bool Equals(object obj) public Type GetType() protected object MemberwiseClone() public static bool ReferenceEquals(object objA, object objB) public static bool Equals(object objA, object objB)
  10. 10. 메모리 관리 • Stack • 메서드 흐름에 따라 할당과 해제 • 값 형식 개체 • 개체 참조(reference) • Heap • • • • • • new 구문을 사용하여 할당 GC에 의해 해제 참조 형식 개체 Boxing된 값 형식 개체 필드 + 3 * 4bytes(on a 32-bit platform) Defragmentation
  11. 11. Defragmentation 파편화된 메모리 모형 파편화가 해결된 메모리 모형 • 전체 용량: 10 • 사용량: 6 • 3 메모리 블럭 할당 불가 • 전체 용량: 10 • 사용량: 6 • 3 메모리 블럭 할당 가능
  12. 12. Value Type vs. Reference Type Value Type • Stack or Heap • 작고 빠름 Reference Type • Heap • 런타임 멤버 바인딩 • 대입 시 값 복사 • 대입 시 참조 복사 • 상속 • Boxing • Garbage Collection
  13. 13. Boxing and Unboxing • 참조 형식으로 형변환 • • • • System.Object 인터페이스 복사본 생성 참조 형식의 특징
  14. 14. Boxing and Unboxing int value1 = 10; object h1 = value1; // Boxing IComparable h2 = value1; // Boxing object h3 = h2; // Reference copy value2 Reference copy Unboxing h3 h2 Boxing h1 value1 : Int32 Boxing … int value2 = (int)h3; // Unboxing Stack Console.WriteLine(object.Equals(h1, h2)); // Console.WriteLine(object.Equals(h2, h3)); // Console.WriteLine(object.ReferenceEquals(h1, Console.WriteLine(object.ReferenceEquals(h2, : Int32 True True h2)); // False h3)); // True Heap
  15. 15. DEMO Value Type Performance
  16. 16. Garbage Collection • Mark and Sweep • Root 개체들로부터 개체 참조 그래프를 탐색하며 Mark • Mark된 개체들은 생존
  17. 17. 4bytes(on a 32-bit platform) • 참조 변수 • 메모리 주소 struct MyValType { … } class MyRefType { … } • ≠ Pointers in C/C++ 4bytes MyValType valObj = new MyValType(); MyRefType refObj = new MyRefType(); refObj … valObj Instance … Stack Heap
  18. 18. 4bytes(on a 32-bit platform) • Type 정보 • 런타임 바인딩 class MyRefType { … } class MySubType : MyRefType { … } • 가상 멤버 • 인터페이스 구현 refObj : MyRefType … Type information Instance … Stack Heap MyRefType refObj = new MySubType(); MySubType description 4bytes
  19. 19. 4bytes(on a 32-bit platform) • 개체 핸들 • GC 과정에서 개체 이동 • 개체 이동 부하 최소화 class MyRefType { … } MyRefType ref1 = new MyRefType(); MyRefType ref2 = ref1; object obj = ref2; obj Instance ref2 ref1 Handle 4bytes Stack Instance Heap
  20. 20. Delegates • • • • 메서드를 기억하고 호출을 대리하는 개체 메서드 포인터 + 메타데이터 + 대상 개체 참조 이벤트 무명 메서드 • Lambda expression • Delegate Delegate.CreateDelegate(…, MethodInfo)
  21. 21. DEMO Delegate Performance
  22. 22. Event • 대리자에 대한 접근을 노출하는 add 메서드와 remove 메서드 집합 • 외부에 +=(subscribe)/ -=(unsubscribe) 연산 노출 • 이벤트 소유자만 이벤트 publish 가능
  23. 23. Event 구현(Implicit vs. Explicit) public class MyClass { public event EventHandler Event1; private EventHandler _event2; public event EventHandler Event2 { add { this._event2 += value; } remove { this._event2 -= value; } } }
  24. 24. Event Publishing public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(PropertyChangedEventArgs e) { if (this.PropertyChanged != null) this.PropertyChanged(this, e); } private string _name; public string Name { get { return this._name; } set { this._name = value; this.OnPropertyChanged(new PropertyChangedEventArgs("Name")); } }
  25. 25. Event 메모리 사용 • 초기화된 인스턴스 • 어떤 이벤트도 구독되지 않은 상태 • 모든 이벤트 대리자 필드 값이 null인 경우 • 이벤트 수 * 4bytes(on a 32-bit platform) • System.Windows.Forms.Control 클래스 이벤트 수 ≒ 70
  26. 26. EventHandlerList • • • • • System.ComponentModel 네임스페이스 이벤트 핸들러 대리자 목록 관리 구독된 이벤트에 대해서만 메모리 할당 이벤트 수가 적으면 비경제적 이벤트 수가 많을수록 경제적
  27. 27. EventHandlerList 기반 구현 private EventHandlerList _events = new EventHandlerList(); private static readonly object PropertyChangedKey = new object(); public event PropertyChangedEventHandler PropertyChanged { add { this._events.AddHandler(PropertyChangedKey, value); } remove { this._events.RemoveHandler(PropertyChangedKey, value); } } protected virtual void OnPropertyChanged(PropertyChangedEventArgs e) { var h = _events[PropertyChangedKey] as PropertyChangedEventHandler; if (h != null) h(this, e); }
  28. 28. Subscriber 참조 EventPublisher publisher = new EventPublisher(); Stack Walker publisher.Fire += new EventSubscriber("Mac").Handler; new EventSubscriber("Tosh"); publisher GC.Collect(); GC.WaitForPendingFinalizers(); publisher.RaiseFire(); Console.WriteLine("Finish"); Heap : EventHandler “Mac” “Tosh”
  29. 29. WeakEventHandler EventPublisher publisher = new EventPublisher(); Stack Walker new WeakEventHandler(publisher, new EventSubscriber("Mac")); new EventSubscriber("Tosh"); I’m too weak. Don’t kill me. GC.Collect(); GC.WaitForPendingFinalizers(); publisher.RaiseFire(); Console.WriteLine("Finish"); Heap publisher : EventHandler : WeakEventHandler Weak Reference “Mac” “Tosh”
  30. 30. DEMO Weak Event Subscription
  31. 31. Explicit Interface Implementation interface IMyIntf1 { string Foo(); } interface IMyIntf2 { string Foo(); } class MyClass : IMyIntf1, IMyIntf2 { public string Foo() { return "Hello"; } string IMyIntf2.Foo() { return "World"; } }
  32. 32. DEMO Explicit Interface Implementation
  33. 33. Summary • • • • • System.Object Garbage Collection Value Types and Reference Types Delegates and Events Explicit Interface Implementation
  34. 34. QnA
  35. 35. Take a break
  36. 36. 2.0 Generic Anonymous methods Iterator methods struct Nullable<T> where T : struct
  37. 37. Generic • Reusable Code Definition • Class, Interface, Delegate and Method • Constraints
  38. 38. Code Definition • • • • • 형식 안정적 코드 재사용 어셈블리에 빌드 런타임 코드 생성 성능 향상 값 형식에 대해 메모리 사용량 감소
  39. 39. Code Definition Class Definition List<T> : ArrayList : object^ : List<double> : object^ : double … : double : string^ : string^ : double : string^ … : object^ : double : double : double : List<string> … : string : string : string
  40. 40. DEMO System.Collections.ArrayList vs. System.Collections.Generic.List<T>
  41. 41. Generic 제약조건 • 제네릭 코드에 사용할 수 있는 형식 매개변수를 제한 • • • • class/ struct Base Types new() 예) 매개변수가 없는 생성자를 제공하고 자신이 형식 매개변수인 IComparable<> 인터페이스를 구현하는 참조 형식 where T : class, IComparable<T>, new()
  42. 42. Anonymous Methods • • • • Closure 부모의 이름 범위에 접근하는 내장 메서드 이벤트 핸들러 콜백 메서드
  43. 43. 지역 변수 접근 int value = 0; JobBuffer jobBuffer = new JobBuffer(); jobBuffer.Push(delegate() { value += 1; }); jobBuffer.Push(delegate() { value += 10; }); Console.WriteLine("Value: {0}", value); jobBuffer.Flush(); Console.WriteLine("Value: {0}", value);
  44. 44. 지역 변수 접근 구현
  45. 45. DEMO Anonymous Methods
  46. 46. In Loops Proc[] procs = new Proc[5]; for (int i = 0; i < procs.Length; i++) { procs[i] = delegate() { return i * i; }; } foreach (Proc proc in procs) Console.WriteLine(proc()); What do you expect?
  47. 47. In Loops Proc[] procs = new Proc[5]; for (int i = 0; i < procs.Length; i++) { int n = i; procs[i] = delegate() { return n * n; }; } foreach (Proc proc in procs) Console.WriteLine(proc());
  48. 48. DEMO Anonymous Methods in Loops
  49. 49. Iterator Methods • 동일한 형식의 순차적 요소 집합을 제공하는 메서드 • 컴파일러에 의해 생성되는 시퀀스 • IEnumerable<T> 또는 IEnumerator<T> • yield return • yield break • 데이터가 아닌 논리(지연된 실행) • Linq operations
  50. 50. Arithmetic Progression 직접 구현 private readonly double _init; private readonly double _diff; private readonly int _n; public ArithmeticProgressionEnumerable(double initialTerm, double difference, int count) { this._init = initialTerm; this._diff = difference; this._n = count; } public IEnumerator<double> GetEnumerator() { return new Enumerator(this); } IEnumerator IEnumerable.GetEnumerator() { return this.GetEnumerator(); }
  51. 51. Arithmetic Progression 직접 구현 private ArithmeticProgressionEnumerable _source; private int _pos; public Enumerator(ArithmeticProgressionEnumerable enumerable) { this._source = enumerable; this._pos = 0; } public bool MoveNext() { if (this._pos >= this._source._n) return false; this._pos++; return true; } public double Current { get { if (this._pos <= 0) throw new InvalidOperationException(); return this._source._init + this._source._diff * (this._pos - 1); } } public void Reset() { this._pos = 0; }
  52. 52. Arithmetic Progression Iterator IEnumerable<double> ArithmeticProgression(double initialTerm, double difference, int count) { for (int i = 0; i < count; i++) yield return initialTerm + difference * i; }
  53. 53. Arithmetic Progression Iterator 빌드
  54. 54. Delayed Execution public IEnumerable<int> MyIterator() { Console.WriteLine("Ready"); yield return 1; Console.WriteLine("Done"); } var s1 = MyIterator(); var s2 = MyIterator(); Console.WriteLine("I have 2 sequences."); foreach (int e in s2) Console.WriteLine(e);
  55. 55. DEMO Delayed Execution
  56. 56. System.Nullable<> • 값 형식 변수에 null 상태를 부여하는 값 형식(Boxing and Unboxing) • + : System.Boolean • Nullable<type_name> or type_name? • System.Nullable 도우미 static 클래스 • GetType()
  57. 57. Nullable<> 핵심 코드 public struct Nullable<T> where T : struct { private bool hasValue; internal T value; } public Nullable(T value) { this.value = value; this.hasValue = true; } public bool HasValue { get { return this.hasValue; } } public T Value { get { if (!this.HasValue) ThrowHelper.ThrowInvalidOperationException(…); return this.value; } } public static implicit operator T?(T value) { return new T?(value); } public static explicit operator T(T? value) { return value.Value; }
  58. 58. Nullable<> 산술 연산 double x = 2; double? y = null; Write(x * y); // null y = 10; Write(x * y); // 20
  59. 59. Nullable<> 대입 연산 int? x = null; double y; double? z; y = x; // error CS0266: Cannot implicitly convert type 'int?' to 'double'. y = (double)x; // InvalidOperationException: Nullable object must have a value. z = x;
  60. 60. Nullable<> 비교 연산 int x = 10; int y = 20; int? z = null; Console.WriteLine((x < y) == !(x >= y)); // True Console.WriteLine((x < z) == !(x >= z)); // False
  61. 61. Summary • • • • Generic Anonymous Methods Iterator Methods Nullable
  62. 62. QnA
  63. 63. 다음 시간에는… • Linq는 링큐인가? 링크인가? • .NET 프로그래머에게 “Duck typing”의 의미 • 비동기 I/O하려면 Node.js로 가야 하나?
  64. 64.  감사합니다 

×