반응형

전체 글 2934

[C#] 9. 대리자와 이벤트 - 이벤트

9. 대리자와 이벤트 9.2 이벤트 이벤트는 특정 사건이 발생하는 것을 감시하는 개체가 이를 처리하는 개체에게 이벤트가 발생하였을 때 필요한 인자들과 함께 발생 사실을 통보하기 위한 특별한 멤버입니다. 이벤트를 감시하여 다른 개체에게 발생한 사실을 통보하는 개체를 이벤트 게시자라고 하며 이벤트가 발생하였을 때 이벤트 게시자로부터 통보받아 처리하는 개체를 이벤트 구독자라고 합니다. C#에서 이벤트는 대리자 멤버를 캡슐화할 때 event 키워드를 명시하면 됩니다. 그리고 이벤트로 만들기 위해 정의한 대리자는 이벤트를 통보한 개체와 이벤트 처리에 필요한 인자를 포함하여 시그니쳐를 정의하도록 가이드하고 있습니다. ▶ 이벤트를 위한 대리자 정의 class AddMemberEventArgs:EventArgs { p..

[C#] 9. 대리자와 이벤트 - 대리자

9. 대리자와 이벤트 대리자는 메서드의 시그니쳐를 정의하는 형식으로 콜백 처리 등에서 자주 사용됩니다. 그리고 event 키워드를 명시하여 캡슐화한 대리자를 이벤트라 말합니다. 이벤트는 특정 상황이 발생하였는지를 감시하는 개체가 다른 개체에게 발생한 사실을 통보하여 처리하기 위해 캡슐화한 대리자(event 키워드를 명시한 대리자)를 말합니다. 결국 이벤트는 대리자라고 볼 수 있습니다. 9.1 대리자 대리자는 알고리즘을 개체화하여 인자로 전달할 때 사용되는 형식입니다. 이에 대리자를 정의할 때는 알고리즘에 필요한 인자와 리턴 형식을 명시하여 정의합니다. delegate [리턴 형식] [대리자 형식 이름] ( [입력 인자 리스트] ); 개발자가 대리자 형식을 정의하면 컴파일러는 MulticastDelegat..

[C#] 8.2 컬렉션 - IComparable 인터페이스와 IComparer 인터페이스

8.2 컬렉션 8.2.5 IComparable 인터페이스와 IComparer 인터페이스 IComarable 인터페이스와 IComparer 인터페이스는 개체의 값 비교를 제공하기 위해 정의되었습니다. C#의 컬렉션은 대부분 Sort 메서드를 제공하는데 IComparable 인터페이스 기반의 요소를 보관하고 있을 때 정상적으로 동작하고 그렇지 않으면 예외를 발생합니다. 그리고 IComparer 개체를 입력 인자로 받는 Sort 메서드가 중복 정의되어 있는데 정렬하는 과정에서 입력 인자로 받은 IComparer 개체를 이용합니다. 또한, C#의 System에 정의되어 있는 기본 형식들은 ICompable 인터페이스를 기반으로 정의되어 있어서 기본 형식을 보관한 컬렉션은 Sort 메서드를 이용하여 정렬할 수 있..

[C#] 8.2 컬렉션 - IDictionary 인터페이스

8.2 컬렉션 8.2.4 IDictionary 인터페이스 IDictionary 인터페이스는 키와 값을 쌍으로 보관하는 컬렉션들의 기반 형식입니다. 그리고 IList 인터페이스처럼 IDictionary 인터페이스도 ICollection 인터페이스를 기반으로 정의한 형식입니다. IDictionary 인터페이스에는 키와 값을 쌍으로 보관할 때 사용하는 Add 메서드를 제공하고 있으며 내부 규칙에 따라 보관될 위치를 결정하게 됩니다. 따라서 IList 인터페이스와 다르게 특정 위치에 보관하는 Insert 메서드는 제공하지 않습니다. 그리고 IDictionary 인터페이스에는 같은 키를 가진 요소를 보관할 수 없습니다. 만약, Add 메서드를 이용하여 같은 키를 가진 요소를 보관하려고 시도하면 예외가 발생합니다...

[C#] 8.2 컬렉션 - IList 인터페이스

8.2 컬렉션 8.2.3 IList인터페이스 IList 인터페이스는 배열과 ArrayList의 기반 인터페이스입니다. IList 인터페이스에는 인덱서로 요소를 참조할 수 있는 멤버들을 약속하고 있습니다. 그리고 IList는 ICollection 인터페이스 기반의 형식이므로 앞에서 살펴본 ICollection에 약속한 멤버들에 대한 약속을 포함하게 됩니다. 여기에서는 새롭게 추가된 약속들에 대해서만 다룰게요. ICollection 인터페이스에서는 요소를 추가할 때 사용하기 위해 Add 메서드와 Insert 메서드를 제공하고 있습니다. Add 메서드는 차례대로 보관할 때 사용하고 Insert 메서드는 원하는 인덱스 위치에 보관할 때 사용합니다. int Add(object value); //요소를 추가하는 메..

[C#] 8.2 컬렉션 - ICollection 인터페이스

8.2 컬렉션 8.2.2 ICollection 인터페이스 ICollection 인터페이스는 제네릭이 아닌 모든 컬렉션의 기반 인터페이스입니다. 제네릭 컬렉션은 IColleciont 인터페이스를 기반으로 정의되어 있는데 여기서는 ICollection 인터페이스에 대해 살펴볼게요. ICollection은 C#에서 제공하는 제네릭이 아닌 모든 컬렉션의 기반 인터페이스로 컬렉션에 보관된 요소의 개수와 다른 컬렉션에 보관된 요소를 복사하는 메서드, 열거자, 동기화 메서드가 약속되어 있습니다. 물론, 열거자는 ICollection이 IEnumerable을 기반으로 정의되어 있기 때문입니다. ▶ ICollection 인터페이스의 약속된 멤버 class Program { static void Main(string[] ..

[C#] 8.2 컬렉션 - IEnumerable, IEnumerator 인터페이스

8.2 컬렉션 8.2.1 IEnumerable, IEnumerator 인터페이스 ICollection 인터페이스는 C#에서 제공하는 다양한 컬렉션 클랙스들의 기반이 되는 인터페이스입니다. 그리고 ICollection 인터페이스는 IEnumerable 인터페이스를 기반으로 확장된 인터페이스입니다. C#에서 제공되는 컬렉션 개체가 foreach 구문을 통해 보관된 각 요소에 공통적인 작업을 수행할 수 있는 것도 내부적으로 IEnumerable 인터페이스를 기반으로 정의되었기 때문입니다. IEnuerable 인터페이스에는 foreach 구문에서 필요한 멤버들을 약속한 IEnumerator 개체를 반환하는 GetEnumerator 메서드를 제공하고 있습니다. ▶ IEnumerable, IEnumerator에 약..

[C#] 8.2 컬렉션 - 개요

8.2 컬렉션 개요 프로그래밍하다 보면 여러 개의 개체를 구조적으로 관리하는 것은 자주 발생합니다. C#에서는 요소 개체의 집합체인 컬렉션을 다양하게 제공하고 있으며 같은 인터페이스를 기반으로 구현 약속하여 하나의 컬렉션 사용법을 익히면 다른 컬렉션을 사용법을 익히기 쉽습니다. C#에서 제공되는 컬렉션에는 하나의 개체로 보관하는 컬렉션들과 키와 값을 쌍으로 보관하는 컬렉션들이 있습니다. 하나의 개체로 보관하는 컬렉션들은 IList 인터페이스를 기반이거나 ICollection 인터페이스를 기반으로 정의되어 있습니다. 그리고 키와 쌍으로 보관하는 컬렉션들은 IDictionary 인터페이스를 기반으로 정의되어 있습니다. 또한, IList와 IDictionary 인터페이스는 모두 ICollection 인터페이스..

[C#] 8. 인터페이스와 컬렉션 - 인터페이스

8. 인터페이스와 컬렉션 C#에서는 인터페이스를 통해 기능 구현에 대한 약속을 추상화할 수 있습니다. 인터페이스는 묵시적으로 추상 형식이며 클래스나 구조체에서 이를 구현 약속(상속)하면 약속된 기능들을 구현해야 합니다. 이러한 인터페이스를 이용하면 같은 인터페이스 기반의 여러 개체를 인터페이스 형식 변수로 사용하는 다형성의 장점을 누릴 수 있습니다. 또한, 이를 프로그래밍에 사용하면 같은 인터페이스를 구현 약속된 개체의 사용 방법을 별도로 익힐 필요가 없게 됩니다. 그리고 C#에서는 데이터나 개체를 보관할 수 있는 여러 종류의 컬렉션을 제공하고 있으며 필수적인 인터페이스 기반으로 정의되어 있어서 효과적으로 프로그래밍할 수 있습니다. 8.1 인터페이스 인터페이스는 기능 구현에 대한 약속입니다. 인터페이스의..

[C#] 7.4 프로젝트 구현 - 초점이 기숙사 (잠자기, TV 시청)

7.4 프로젝트 구현 초점이 기숙사 (잠자기, TV 시청) [그림] TV 시청 시퀀스 다이어그램 [그림] 잠자기 시퀀스 다이어그램 이번에는 초점이 기숙사에 왔을 때 수행하는 잠자기와 TV 시청에 대한 부분을 구현하기로 합시다. 앞에서 초점이 강의실과 도서관에 왔을 때 수행하는 부분과 구현하는 방법이 크게 다르지 않겠지요. class Dormitory:Place { ... 중략 ... internal override void DoIt(int cmd) { switch (cmd) { case GameRule.CMD_DO_Sleep: TurnOff(); break; case GameRule.CMD_DO_TV: StartTV(); break; default: return; } } private void Start..

반응형