1 / 96

11 장 . 고급 C# 프로그래밍

C#. 11 장 . 고급 C# 프로그래밍. 학습 목표. 속성과 인덱서를 배우고 각각을 비교해 본다 위임과 이벤트의 관계를 이해한다 네임스페이스를 사용하여 프로그램을 간결하게 만들 수 있다 어셈블리를 통하여 .dll 파일을 작성한다 ILDASM 도구를 사용하여 어셈블리의 구성을 파악한다. 목차. 속성 인덱스 위임 이벤트 네임스페이스 어셈블리. 1. 프로퍼티 ( 속성 ). 클래스는 엑세스 지정자라는 것을 통해 중요한 멤버를 외부로부터 보호 할 수 있다. 1. 프로퍼티 ( 속성 ).

kimo
Download Presentation

11 장 . 고급 C# 프로그래밍

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. C# 11장. 고급 C# 프로그래밍

  2. 학습 목표 • 속성과 인덱서를 배우고 각각을 비교해 본다 • 위임과 이벤트의 관계를 이해한다 • 네임스페이스를 사용하여 프로그램을 간결하게 만들 수 있다 • 어셈블리를 통하여 .dll 파일을 작성한다 • ILDASM도구를 사용하여 어셈블리의 구성을 파악한다

  3. 목차 • 속성 • 인덱스 • 위임 • 이벤트 • 네임스페이스 • 어셈블리

  4. 1. 프로퍼티(속성) 클래스는 엑세스 지정자라는 것을 통해 중요한 멤버를 외부로부터 보호 할 수 있다.

  5. 1. 프로퍼티(속성) using System; class Time { privateint hour, min, sec; public Time(int h, int m, int s) { SetHour(h); SetMin(h); SetSec(s); } public intGetHour() { return hour; } public void SetHour(intaHour) { if (aHour < 24) hour = aHour; } public intGetMin() { return min; } public void SetMin(intaMin) { if (aMin < 60) min = aMin; } public intGetSec() { return sec; } public void SetSec(intaSec) { if (aSec < 60) sec = aSec; } public void OutTime() { Console.WriteLine("현재 시간은 {0}시 {1}분 {2}초이다.", hour, min, sec); } } class CSTest { static void Main() { Time Now; Now = new Time(12, 30, 45); Now.OutTime(); Now.SetHour(55); Now.OutTime(); } }

  6. 1. 프로퍼티(속성) • 메서드는 외부로 공개되더라도 전달된 인수를 점검하여 원하는 값만 선택적으로 대입할 수 있다. • 앞의 예에서 Set 메서드는입력값이 일정 기준과 다를 경우 대입을 거절한다.  앞의 예에 대한 객체는 안전함 • 클래스의 이런 기능을 정보 은폐라 한다. • 멤버 변수를 보호하려면 멤버 함수를 같이 만들어야 한다.  필드 하나당 두 개씩의 메서드를 일일이 만드는 것은 불편하다. • C#은 Get/Set 메서드의 쌍을 컴파일러가 대신 생성하는 프로퍼티라는 새로운 멤버를 제공한다.

  7. 1. 프로퍼티(속성) 프로퍼티를 선언하는 기본 형식 • 지정자 타입 이름 • { • get { return 값;} • set { 값 변경 ;} • } • 필드를 선언하는 방법과 유사 • {} 블록 안에 get, set 접근자블록을 추가로 가진다. • get 블록 : 프로퍼티 값을 읽어서 리턴 • set 블록 : 값을 변경하는 코드를 작성 • 컴파일러는 프로퍼티참조문에 대해 get,set블록을 자동으로 호출한다. • 프로퍼티 읽는 경우 : get 접근자를 호출 • 프로퍼티를 쓰는 경우 : set 접근자를 호출 • 프로퍼티는메서드에 적용 가능한 지정자 사용 가능(static, virtual, protected, public, …)

  8. 1. 프로퍼티(속성) 앞 예제를 프로퍼티로 바꾼 내용 using System; class Time { privateint hour, min, sec; public Time(int h, int m, int s) { Hour = h; Min = m; Sec = s; } public int Hour { get { return hour; } set { if (value < 24) hour = value; } } public int Min { get { return min; } set { if (value < 60) min = value; } } public int Sec { get { return sec; } set { if (value < 60) sec = value; } } public void OutTime() { Console.WriteLine("현재 시간은 {0}시 {1}분 {2}초이다.", Hour, Min, Sec); } } class CSTest { static void Main() { Time Now; Now = new Time(12, 30, 45); Now.OutTime(); Now.Hour = 55; Now.OutTime(); } } Get/Set 메서드는 모두 제거됨 Hour, Min, Sec 프로퍼티가 추가됨(프로퍼티는 필드명의 첫 글자를 대문자로) 프로퍼티가 숨겨진 필드의 값을 대신 엑세스하고, 조건에 맞는 값만 인정한다.  객체의 무결성 유지

  9. 1. 프로퍼티(속성) using System; class Time { privateint hour, min, sec; public Time(int h, int m, int s) { SetHour(h); SetMin(h); SetSec(s); } public intGetHour() { return hour; } public void SetHour(intaHour) { if (aHour < 24) hour = aHour; } public intGetMin() { return min; } public void SetMin(intaMin) { if (aMin < 60) min = aMin; } public intGetSec() { return sec; } public void SetSec(intaSec) { if (aSec < 60) sec = aSec; } public void OutTime() { Console.WriteLine("현재 시간은 {0}시 {1}분 {2}초이다.", hour, min, sec); } } class CSTest { static void Main() { Time Now; Now = new Time(12, 30, 45); Now.OutTime(); Now.SetHour(55); Now.OutTime(); } } using System; class Time { privateint hour, min, sec; public Time(int h, int m, int s) { Hour = h; Min = m; Sec = s; } public int Hour { get { return hour; } set { if (value < 24) hour = value; } } public int Min { get { return min; } set { if (value < 60) min = value; } } public int Sec { get { return sec; } set { if (value < 60) sec = value; } } public void OutTime() { Console.WriteLine("현재 시간은 {0}시 {1}분 {2}초이다.", Hour, Min, Sec); } } class CSTest { static void Main() { Time Now; Now = new Time(12, 30, 45); Now.OutTime(); Now.Hour = 55; Now.OutTime(); } }

  10. 1. 프로퍼티(속성) • 객체를 사용하는 쪽에서는 프로퍼티를 마치 필드처럼 읽거나 대입하는 형식으로 액세스 할 수 있다. • 시간을 알고 싶을 때 : Now.Hour프로퍼티를 읽는다 get 접근자가 호출됨 • 시간을 변경하때: Now.Hour = 55 ; 값을 대입 컴파일러는 Hour 프로퍼티의set 접근자를 호출대입식의 우변인 55는 set의 암시적 인수 value로 전달한다. 호출 A = Now.Hour get { return hour ; } Now.Hour = 55 set { hour = value ; } 리턴 호출 전달

  11. 1. 프로퍼티(속성) • Now.SetHour(55) ; 와 Now.Hour = 55 는 차이는 별로 없으며 실제 실행되는 코드도 같다. • 프로퍼티는Get/Set 메서드를 쓰는 것보다는 확실히 더 진보된 방법이다.

  12. 1. 프로퍼티(속성) 프로퍼티의 장점 • 참조문이 더 간단하다 • 프로퍼티는 코드를 가진 메서드 이므로 능동적으로 동작한다.즉 조건에 맞는 값만 받아 들인다. • 다음과 같이 여러 개의 필드로부터 복잡한 값을 조합해 내는 수식에 자주 사용된다.private int price ; private double sale;public double SalePrice{ get { return price * sale ; }}

  13. 1. 프로퍼티(속성) 프로퍼티의 장점 • 값을 바꾸면서 다른 코드도 실행할 수 있으므로 값이 바뀔 때 같이 해야 하는 작업을 처리할 수 있다. 예를 들어 날짜를 바꾸면 요일도 같이 바꿀수 있다. 이러한 것을 자동 처리 가능하게 할 수 있다. • 읽기 전용이나 쓰기 전용의 프로퍼티를 만들 수 있다.디스크의 용량 조사는 읽기 저용프로퍼티의 예 • 닷넷2.0 부터는 get, set 접근자의 액세스 권한을 다르게 지정할 수 있다.앞 예제에서 Sec 프로퍼티의set 접근자만 protected 로 변경하면 이 접근자는 자신이나 파생 클래스에서만 호출할 수 있다.public int Sec{ get { return sec ; } protected set { if(value < 60 ) sec = value ; }}

  14. 1. 프로퍼티(속성) 프로퍼티의 장점 • 프로퍼티는Get/Set 메서드보다 더 빠르게 동작한다. Get/Set 메서드는메서드 이므로 호출에 따른 부담이 있다. • 짧은 접근자의 프로퍼티는 컴파일러에 의해 인라인 처리 되기 때문에 호출 과정은 없다. 단, 가상으로 선언되었거나 본 체의 코드가 너무 길 때는 인라인화 되지 않는다. • 프로퍼티는 필드처럼 보이지만 실제로는 메서드이며 내부적으로도 메서드로 구현된다. 그러므로 메서드가 할 수 있는 거의 모든 동작을 할 수 있다.(가상으로 선언할 수도 있고, 재정의도 가능하고, 추상으로 선언할 수도 있다. 또한 다형성도 성립한다.) • 프로퍼티가 필드처럼 보이지만 실제로 기억 장소가 할당되어 있는 필드는 아니다. 그러므로 프로퍼티를메서드의 출력용 인수나 참조용 인수로 전달하는 것은 불가능하다.

  15. 1. 속성 속성(property)은 클래스의 내부에 존재하는 정보를 의미 C#에서는 속성에 접근해서 값을 가져오거나 혹은 새로 값을 부여할 때 set과 get 명령을 사용한다.

  16. 1. 속성 • 속성(property)이란? 클래스의 속성을 함수적 동작에 의하여, 표현하는 구성요소다 • 필드처럼 보이지만 실제로는 메소드처럼 동작한다. • get,set접근자에 의하여 표현이 된다. • 클래스의 내부구조를 추상적으로 표현하여 보호한다. • 내부적으로 메모리가 배정되지 않는다. • 메소드처럼 동작하므로, virtual, static, abstract, override 키워드 사용이 가능하다.

  17. 1. 속성 • 속성(property)사용 예제(1/7) namespace PropertySample1 { using System; public class PropertyTest { private string _name; public string Name { get { return _name; } set { _name = value; } } } public class Test { public static void Main(string[] args) { PropertyTest pt = new PropertyTest(); pt.Name = "첫번째프로퍼티 예제 입니다."; Console.WriteLine(pt.Name); } } } (17행) PropertyTest 클래스의 인스턴스pt 생성 (18행) 생성된 인스턴스pt의 속성인 Name에 값 지정 (19행) pt의 속성 Name 출력

  18. 1. 속성 • 속성(property)사용 예제(2/7) namespace PropertySample1 { using System; public class PropertyTest { private string _name; public string Name { get { return _name; } set { _name = value; } } } public class Test { public static void Main(string[] args) { PropertyTest pt = new PropertyTest(); pt.Name = "첫번째프로퍼티 예제 입니다."; Console.WriteLine(pt.Name); } } } PropertyTest클래스 _name : private로 설정된 PropertyTest클래스의 멤버 필드 Name : public으로 설정된 PropertyTest클래스의 속성 get : read 기능을 수행하는 메소드 set : write 기능을 수행하는 메소드 value : set 접근자에게 전달되는 인자 값

  19. 1. 속성 • 속성(property)사용 예제(3/7) namespace PropertySample1 { using System; public class PropertyTest { private string _name; public string Name { get { return _name ; } set { _name = value ; } } } public class Test { public static void Main(string[] args) { PropertyTest pt = new PropertyTest(); pt.Name = "첫번째프로퍼티 예제 입니다."; Console.WriteLine(pt.Name); } } } PropertyTest클래스에서는 이 클래스의 멤버 필드 변수 _name과 Name 속성이 존재한다. get 접근자는read 기능을 포함하며, 멤버 필드의 값을 읽을 때 실행한다. set 접근자는write 기능으로 멤버 필드 값을 지정할 때 실행한다. 즉, 속성은 get, set 명령을 통해 멤버 필드 값을 읽거나 쓸 수 있는 기능을 제공한다. 다른 클래스에서 멤버필드 변수를 읽거나 쓰려고 요청이 들어 왔을 때만 속성을 사용할 수 있다.

  20. 1. 속성 • 속성(property)사용 예제(4/7) namespace PropertySample1 { using System; public class PropertyTest { private string _name; public string Name { get { return _name ; } set { _name = value ; } } } public class Test { public static void Main(string[] args) { PropertyTest pt = new PropertyTest(); pt.Name = "첫번째프로퍼티 예제 입니다."; Console.WriteLine(pt.Name); } } } (17행) Main() 메소드에서pt 인스턴스를 만든 이유 : PropertyTest클래스 내에 있는 속성(7행 Name) 접근

  21. 1. 속성 • 속성(property)사용 예제(5/7) namespace PropertySample1 { using System; public class PropertyTest { private string _name; public string Name { get { return _name ; } set { _name = value ; } } } public class Test { public static void Main(string[] args) { PropertyTest pt = new PropertyTest(); pt.Name = "첫번째프로퍼티 예제 입니다."; Console.WriteLine(pt.Name); } } } (18행) 직접적으로 속성 Name의 값을 지정  속성 내에 존재하는 접근자 중에 set연산자(10행)를 사용해서 _name 값을 바꾸었고, 인자인 “첫번째프로퍼티 예제 입니다.” 라는 문자열이 속성 내의 value 변수로 복사되어 _name 필드에 저장된다.

  22. 1. 속성 • 속성(property)사용 예제(6/7) namespace PropertySample1 { using System; public class PropertyTest { private string _name; public string Name { get { return _name ; } set { _name = value ; } } } public class Test { public static void Main(string[] args) { PropertyTest pt = new PropertyTest(); pt.Name = "첫번째프로퍼티 예제 입니다."; Console.WriteLine(pt.Name); } } } (19행) Console.WriteLine(pt.Name) 명령을 통해서 멤버 필드를 출력하는 경우는 get접근자가 사용되며, _name의 값을 리턴하고 그 값이 pt.Name에 저장되어 출력된다.

  23. 1. 속성 • 속성(property)사용 예제(7/7) namespace PropertySample1 { using System; public class PropertyTest { private string _name; public string Name { get { return _name ; } set { _name = value ; } } } public class Test { public static void Main(string[] args) { PropertyTest pt = new PropertyTest(); pt.Name = "첫번째프로퍼티 예제 입니다."; Console.WriteLine(pt.Name); } } } • 속성 내에 선언된 get, set 접근자는 프로그램을 실행할 때 연이어 실행되는 명령이 아니라, 각 문장의 구조에 따라 사용되기도 하고, 사용되지 않기도 한다. • 여기서는 get과 set 을 각각 한번씩 호출해서 사용했다.

  24. 1. 속성 • 속성의 형식 속성은 get 접근자를 통해 필드 값을 돌려주고, set 접근자를 통해 인자를 받아 필드 값을 변경하기도 하는데, 경우에 따라 get 접근자를 사용하거나 set 접근자만을 사용하는 속성이 존재 할 수도 있다. 기능적으로 속성을 크게 네가지로 나눌 수 있다.

  25. 1. 속성 • 속성의 종류 •  Read-Write Property : get,set 두 개의 접근자 모두를 사용 하며 프로퍼티의 가장 일반적인 모습이다. •  Read-Only Property : get접근자만 프로퍼티 내 존재하여, 읽을 수만 있는 읽기전용 프로퍼티. •  Write-Only Property : set접근자만 사용하며, 멤버 값을 쓰기 만 할 수 있는 프로퍼티. •  Static Property : 클래스 레벨에 존재하는 프로퍼티로서, 개체 를 만들지 않고도 사용이 가능하며, this 키워드 사용이 불가능하 다.

  26. 1. 속성 • 속성예제 2(도움말) 다음 예제에서는 인스턴스, 정적 및 읽기 전용 속성을 보여 준다. 키보드에서 직원 이름을 입력 받고, NumberOfEmployees변수의 값을 1만큼 증가시킨 다음 직원 이름과 번호를 표시한다. class TestEmployee { static void Main() { Employee.NumberOfEmployees = 100; Employee e1 = new Employee(); e1.Name = "Claude Vige"; System.Console.WriteLine ("Employee number: {0}", Employee.Counter); System.Console.WriteLine ("Employee name: {0}", e1.Name); } } public class Employee { public static intNumberOfEmployees ; private static int counter; private string name; // A read-write instance property: public string Name { get { return name; } set { name = value; } } // A read-only static property: public static int Counter { get { return counter; } } // A Constructor: public Employee() { // Calculate the employee's number: counter = ++counter + NumberOfEmployees ; } }

  27. 인덱서 • 인덱서(Indexer)는 객체를 마치 배열인 것처럼 사용할 수 있는 특별한 메서드이다. • 순서가 있는 여러 개의 필드들이 있을 때, 또는 순서가 있는 어떤 값을 계산해 내는 기능이 있을 때 인덱서를 사용하면 첨자로 원하는 값을 편리하게 액세스 할 수 있다.

  28. 인덱서 • 형식지정자 타입 this[인수]{ get { return 값 ;} set { 값 변경 ; }} 내부에 값을 읽고 쓰는 get, set 접근자 블록을 가지므로 프로퍼티와 유사하다.이름이 this로 고정 액세스 대상인 첨자를 {}괄호 안의 인수로 전달한다.

  29. 2. 인덱스 • 인덱서(indexer)란? • 인덱서의 특징 내부적으로 객체를배열처럼 사용할 수 있게 해주는 일종의 연산자 이다. 속성(property)과 마찬가지로 모습은 필드이지만 실제로는 메소드로 동작한다. • 필드처럼 보이지만 실제 동작은 메소드이다. • get , set 접근자에 의하여 표현된다 • this키워드를 반드시 사용한다. • 배열에 접근 하는 것 처럼 []기호를 사용한다.

  30. 2. 인덱스 • 인덱서의 쓰임 public class IndexerTest { private string[] list; private string this[intidx] { get { return list[idx]; } set { list[idx] = value; } } } (3행) list 는 IndexerTest클래스의 내부에 설정된 문자열형 배열. get, set 접근자를 사용하는 속성과 차이 ; - 속성 : 일반 변수를 읽고 저장 - 인덱서: 배열 요소를 읽고 저장 다른 클래스에서 이 클래스에게 list의 값을 요청한다면 (6행)이 실행 되고반대로 list의 값을 저장했다면 (7행)이 실행된다.

  31. 2. 인덱스 • 인덱서의 사용 • 인덱서는 속성과는 다르게 this키워드를 사용해서 구현한다. • 인덱서는 배열을 사용하는데, 원래의 배열에서는정수형 요소만 사용할 수 있으나,인덱서에서 사용하는 배열의 요소는 구분이 가능한 자료형이라면 무엇이든지 가능하다. • 또한 인덱서는오버라이딩이 가능하므로 여러 형식의 인덱서가존재할 수 있다.

  32. 2. 인덱스 • 인덱서 사용 예제의 도식화 IndexerTest(클래스) myFavorite(해쉬 테이블) this(메소드) 입력 기능 명령어 출력 기능 명령어

  33. 2. 인덱스 • 인덱서의 사용 예제(1/5) • 다음 예제는 좋아하는 과일과 색을 해시 테이블에 저장하고, 인자로는 항목을 넘겨주어해당 항목에 저장된 인덱서의 값을 보여주는 예이다. namespace Indexer1 { using System; using System.Collections; public class IndexerTest { private HashtablemyFavorite = new Hashtable(); public string this[string kind] { get { return (string)myFavorite[kind]; } set { myFavorite[kind] = value; } } } public class Test { public static void Main(string[] args) { IndexerTest it = new IndexerTest(); it["fruit"] = "apple"; //입력기능 명령어 호출 it["color"] = "blue"; System.Console.WriteLine(it["fruit"]); System.Console.WriteLine(it["color"]); } } } (4~8행) IndexerTest클래스는 실제 인덱서를 구현 (11~17행) Test 클래스는 IndexerTest클래스의 인스턴스 생성 및 set과 get 접근자 호출

  34. 2. 인덱스 • 인덱서의 사용 예제(2/5) • 다음 예제는 좋아하는 과일과 색을 해시 테이블에 저장하고, 인자로는 항목을 넘겨주어해당 항목에 저장된 인덱서의 값을 보여주는 예이다. namespace Indexer1 { using System; using System.Collections; public class IndexerTest { private HashtablemyFavorite = new Hashtable(); public string this[string kind] { get { return (string)myFavorite[kind]; } set { myFavorite[kind] = value; } } } public class Test { public static void Main(string[] args) { IndexerTest it = new IndexerTest(); it["fruit"] = "apple"; it["color"] = "blue"; System.Console.WriteLine(it["fruit"]); System.Console.WriteLine(it["color"]); } } } (5행) myFavorite해시 테이블을 선언 (7행,8행) kind를 인자로 받아서 해시 테이블에 해당 인자에 포함된 값을 각각 get, set 실행

  35. 2. 인덱스 • 인덱서의 사용 예제(3/5) • 다음 예제는 좋아하는 과일과 색을 해시 테이블에 저장하고, 인자로는 항목을 넘겨주어해당 항목에 저장된 인덱서의 값을 보여주는 예이다. 프로그램 실행 순서 (13행) IndexerTest클래스형인스턴스it를 생성 (14,15행) ‘it[“항목”] = 실제 값’ 명령을 통해 fruit 항목에는 apple을 color 항목에는 blue를 대입 위 과정은 6~8행에 정의된 인덱스의 set접근자를 호출하고, (5행)myFavorite해시 테이블에는 다음과 같이 저장된다. myFavorite[“fruit”] = “apple” ; myFavorite[“color”] = “blue” ; namespace Indexer1 { using System; using System.Collections; public class IndexerTest { private HashtablemyFavorite = new Hashtable(); public string this[string kind] { get { return (string)myFavorite[kind]; } set{ myFavorite[kind] = value; } } } public class Test { public static void Main(string[] args) { IndexerTest it = new IndexerTest(); it["fruit"] = "apple"; it["color"] = "blue"; System.Console.WriteLine(it["fruit"]); System.Console.WriteLine(it["color"]); } } }

  36. 2. 인덱스 • 인덱서의 사용 예제(4/5) • 다음 예제는 좋아하는 과일과 색을 해시 테이블에 저장하고, 인자로는 항목을 넘겨주어해당 항목에 저장된 인덱서의 값을 보여주는 예이다. namespace Indexer1 { using System; using System.Collections; public class IndexerTest { private HashtablemyFavorite = new Hashtable(); public string this[string kind] { get{ return (string)myFavorite[kind]; } set { myFavorite[kind] = value; } } } public class Test { public static void Main(string[] args) { IndexerTest it = new IndexerTest(); it["fruit"] = "apple"; it["color"] = "blue"; System.Console.WriteLine(it["fruit"]); System.Console.WriteLine(it["color"]); } } } 프로그램 실행 순서 (16,17행) fruit, blue 항목에 대한 값을 출력 이 과정에서 인덱서의 get접근자를호출해서 apple과 blue가 각각 출력된다.

  37. 2. 인덱스 • 인덱서의 사용 예제(5/5) • 다음 예제는 좋아하는 과일과 색을 해시 테이블에 저장하고, 인자로는 항목을 넘겨주어해당 항목에 저장된 인덱서의 값을 보여주는 예이다. namespace Indexer1 { using System; using System.Collections; public class IndexerTest { private HashtablemyFavorite = new Hashtable(); public string this[string kind] { get { return (string)myFavorite[kind]; } set { myFavorite[kind] = value; } } } public class Test { public static void Main(string[] args) { IndexerTest it = new IndexerTest(); it["fruit"] = "apple"; it["color"] = "blue"; System.Console.WriteLine(it["fruit"]); System.Console.WriteLine(it["color"]); } } } 유의할 사항 : 인덱서를 정의할 때 속성과는 다르게 (6행)과 같이 this키워드를 사용, 또한 속성은 클래스 내부의 특정 값을 가져오거나 저장할 때 get, set 접근자를 사용해서 변수 값 하나를 가져오거나 저장 하지만, 인덱서는 예제와 같이 배열 형식의 변수를 사용할 수 있다.

  38. 3. 위임 • 위임 • 위임의 특징 위임이란 말의 원래 의미는 대리자,대신하는 사람을 의미 C#에서 이벤트가 발생하였을 때 내부적으로 이벤트를 처리하기 위한 기술 • 위임의 구조는 함수의 포인터(주소)를 저장하는 구조이다. • 저장되는 함수의 원형과 위임 함수의 원형은 반드시 같아야 한다. • 객체지향의 속성 중에 다형성과 비슷한 작업을 수행할 수 있다. • 프로그램의 실행 시에 생성된다.

  39. 위임 코드의 도식화 위임함수(onClick) 선언 위임 실행 클래스 선언 위임 메소드(마우스 클릭) 선언 위임 메소드(키보드 클릭) 선언 위임 호출 클래스 선언 위임 메소드(마우스 클릭) 호출 위임 메소드(키보드 클릭) 호출

  40. 3. 위임 • 위임 사용 예제(1/5) (3행)위임 하나를 선언하고, 사용자가 마우스나 키 보드를 클릭 했을 때 위임을 사용해서 적절한 함수를 실행시키는 과정을 가정한 예 namespace DelegateSample { using System; delegate void onClick(string what); public class TestDelegate { public void MouseClick(string what) { System.Console.WriteLine("마우스의 {0} 버튼이 클릭 되었습니다.", what); } public void KeyBoardClick(string what) { System.Console.WriteLine("키보드의 {0} 버튼이 클릭 되었습니다.", what); } } public class UseDelegate { public static void Main(string[] args) { TestDelegate td = new TestDelegate(); onClickdeleMethod = new onClick(td.MouseClick); deleMethod("왼쪽"); deleMethod = new onClick(td.KeyBoardClick); deleMethod("스페이스"); } } } 위임 문법 delegate 리턴형값메소드(인자목록)

  41. 3. 위임 • 위임 사용 예제(2/5) (4~8행) TestDelegate는 위임이 실제로 실행하는 클래스 (10~16행) UseDelegate는 이벤트가 발생했을 때 위임을 호출해서이벤트에 알맞은 함수를 실행 해주는 클래스 namespace DelegateSample { using System; delegate void onClick(string what); public class TestDelegate { public void MouseClick(string what) { System.Console.WriteLine("마우스의 {0} 버튼이 클릭 되었습니다.", what); } public void KeyBoardClick(string what) { System.Console.WriteLine("키보드의 {0} 버튼이 클릭 되었습니다.", what); } } public class UseDelegate { public static void Main(string[] args) { TestDelegate td = new TestDelegate(); onClickdeleMethod = new onClick(td.MouseClick); deleMethod("왼쪽"); deleMethod = new onClick(td.KeyBoardClick); deleMethod("스페이스"); } } }

  42. 3. 위임 • 위임 사용 예제(3/5) (3행) delegate 키워드를 통해 위임 함수 onClick() 선언 (문자열 형 what 인자 포함) namespace DelegateSample { using System; delegate void onClick(string what); public class TestDelegate { public void MouseClick(string what) { System.Console.WriteLine("마우스의 {0} 버튼이 클릭 되었습니다.", what); } public void KeyBoardClick(string what) { System.Console.WriteLine("키보드의 {0} 버튼이 클릭 되었습니다.", what); } } public class UseDelegate { public static void Main(string[] args) { TestDelegate td = new TestDelegate(); onClickdeleMethod = new onClick(td.MouseClick); deleMethod("왼쪽"); deleMethod = new onClick(td.KeyBoardClick); deleMethod("스페이스"); } } } (5행,7행) 위임이 실행해야 할 함수 - MouseClick(string what) - KeyBoardClick(string what)  마우스를 클릭하거나 키보드를 누를 때 위임에 의해 이 함수가 실행된다고 가정함

  43. 3. 위임 • 위임 사용 예제(4/5) namespace DelegateSample { using System; delegate void onClick(string what); public class TestDelegate { public void MouseClick(string what) { System.Console.WriteLine("마우스의 {0} 버튼이 클릭 되었습니다.", what); } public void KeyBoardClick(string what) { System.Console.WriteLine("키보드의 {0} 버튼이 클릭 되었습니다.", what); } } public class UseDelegate { public static void Main(string[] args) { TestDelegate td = new TestDelegate(); onClickdeleMethod = new onClick(td.MouseClick); deleMethod("왼쪽"); deleMethod = new onClick(td.KeyBoardClick); deleMethod("스페이스"); } } } (3행)에서 위임 선언됨 (13행)에서 deleMethod 란 이름으로 위임의 인스턴스가 생성되는데, 이때 인자로는 위임이 실제로 실행할 함수명을 입력 받는다. (14행)에서 생성된 위임을 실행하자 MouseClick() 함수가 실행됨 (15행)에서 deleMethod를 재정의해서 (16행)에서 실행했다. 이러한 원리로, 위임은 계속 재정의되면서 발생하는 이벤트에 맞는 함수를 실행해 준다.

  44. 3. 위임 • 위임 사용 예제(4/5) namespace DelegateSample { using System; delegate void onClick(string what); public class TestDelegate { public void MouseClick(string what) { System.Console.WriteLine("마우스의 {0} 버튼이 클릭 되었습니다.", what); } public void KeyBoardClick(string what) { System.Console.WriteLine("키보드의 {0} 버튼이 클릭 되었습니다.", what); } } public class UseDelegate { public static void Main(string[] args) { TestDelegate td = new TestDelegate(); onClickdeleMethod = new onClick(td.MouseClick); deleMethod("왼쪽"); deleMethod = new onClick(td.KeyBoardClick); deleMethod("스페이스"); } } }

  45. 4. 이벤트 4. 이벤트 이벤트란, 어떤 일이나 특별한 행위를 발생시키는 역할을 한다. 예) 인터넷 익스플로러 실행 시 <뒤로>버튼 클릭 하면  이벤트가 발생하고, 웹페이지가 이전에 보았던 페이지로 이동하는 기능이 있는 함수를 호출

  46. 4. 이벤트 4. 이벤트 이벤트 발생 <뒤로>버튼 클릭 익스플로러의 내부 움직임 신호전달 뒤로 가기 기능 <뒤로>버튼 객체 사용자가 원하는 기능을 실행시키면, 프로그램은 이벤트를 통해 전달받아 해당 기능을 실행시켜준다. 즉, 이벤트는 프로그램에서 상태가 변하거나 사건이 발생했을 때 이를 객체에게 알려주는 구조를 말한다.

  47. 4. 이벤트 • 이벤트(event)란? • 이벤트의 특징 프로그램에서 어떠한 상태,사건이 발생하였을 때, 이 상태를 객체에게 알려주는 구조 • 위임의집합형태로 표현이 된다. • += , -= 의 연산을 사용하여 이벤트를 추가,삭제 한다. • 이벤트의 발생을 알려주는 Sender와 Event를 원하는 Subscriber가 존재한다. • 일반함수를 호출하듯이 사용한다.

  48. 4. 이벤트 위임 문법 delegate 리턴형값메소드(인자목록) delegate void onClick(string what); 이벤트의 변수 선언 형식 [속성][변경자] 이벤트형식 이벤트변수명 public event onClickmyClick;

  49. 4. 이벤트 • 이벤트(event)사용 예제- 앞의 예제에서 이벤트 추가 namespace EventSample { using System; public delegate void onClick( string what); public class TestDelegate { public void MouseClick( string what) { System.Console.WriteLine ("마우스의 {0} 버튼이 클릭 되었습니다.", what); } public void KeyBoardClick( string what) { System.Console.WriteLine ("키보드의 {0} 버튼이 클릭 되었습니다.", what); } } public class UseDelegate { public eventonClickmyClick; //1. 이벤트 선언 public static void Main( string[] args) { UseDelegateud = new UseDelegate(); TestDelegate td = new TestDelegate(); onClickdeleMethod = new onClick(td.MouseClick); ud.myClick += deleMethod; //2. 이벤트 추가 deleMethod = new onClick(td.KeyBoardClick); ud.myClick += deleMethod; //2. 이벤트 추가 ud.myClick("어떤"); //3. 이벤트에 등록된 모든 위임 실행 } } } 이벤트의 변수 선언 형식 [속성][변경자] 이벤트형식 이벤트변수명 (13행) 이벤트 변수 선언 (변수의 형식 : onClick)  myClick이벤트가 발생 시 onClick위임을 호출함

  50. 4. 이벤트 • 이벤트(event)사용 예제 namespace EventSample { using System; public delegate void onClick( string what); public class TestDelegate { public void MouseClick( string what) { System.Console.WriteLine ("마우스의 {0} 버튼이 클릭 되었습니다.", what); } public void KeyBoardClick( string what) { System.Console.WriteLine ("키보드의 {0} 버튼이 클릭 되었습니다.", what); } } public class UseDelegate { public eventonClickmyClick; //1. 이벤트 선언 public static void Main( string[] args) { UseDelegateud = new UseDelegate(); TestDelegate td = new TestDelegate(); onClickdeleMethod = new onClick(td.MouseClick); ud.myClick += deleMethod; //2. 이벤트 추가 deleMethod = new onClick(td.KeyBoardClick); ud.myClick += deleMethod; //2. 이벤트 추가 ud.myClick("어떤"); "); //3. 이벤트에 등록된 모든 위임 실행 } } } (19, 21행) : 선언한 이벤트를 위임 형식의 변수 deleMethod에 추가함 (22행) : 이벤트가 실행될 때 까지 해당 이벤트에 등록된(MouseClick(), KeyBoardClick()) 모든 위임이 실행됨 이벤트의 추가는 += 연산자 사용한다. 이벤트 += 위임 ;

More Related