아디봉의.net
C# 1.1 Delegate 본문
Delegate
유언장 과 같은기능이다. 유언장에는 일련의 지시들이 있다. 예를 들면 고지서에 요금을 내고, 자선단체에 기부도 좀하고 나머지는 내고양이에게 물려준다. 이유언장은 죽기전에 써야하고 안전한곳에 잘두어야 하며 , 죽고난후에 대리인이 이 유언장의 내용을 처리해준다.
즉 적절한 시점에 실행되어야 할 이련의 일들이라는 것이다.
리턴타입과 타입파라미터만 같다면, 조건에 맞는다면, 어떠한 메소드라도 실행시킬 수 있다. 특정한때 --> 이벤트 가 갑자기 떠올라야한다. ^^
선언 : delegate void simpleDelegate();
선언된 것중 delegate만 제거하면 메소드 랑 같다.
c언어에서라면 함수(실제로는 함수포인터라고 할 수 있지만 형태는 함수의 형태와 같다.)라고 할수 있다.
리턴타입 델리게이트(파라미터 타입)으로 구성이 되면서 delegate만 붙었을 뿐이지 메소드와 똑같은 형태이다.
하지만 객체지향 언어는 클래스 기반이며, c언어의 있는 함수라는게 없다 . 모두 클래스의메소드 이다. 다시 말해서 위와 같은 형태 (마치 c언어의 함수와 같은)로 사용 할 수 없다.
하지만 델리게이트는 마치 클래스와 같은 하나의 타입처럼 동작 함
즉 클래스처럼 인스턴스를 생성시킬수 있다.
simpleGelegate sdg = new simpleDelegate();
클래스도 아닌것이 하나의 함수가 마치 클래스처럼 동작함
그렇다면 일개 함수 형태를 클래스처럼 동작을 시켜야만 하는 이유가 있을것이다.
이유가 없다면 걍 기존 클래스 메소드 사용하기가 더 편리할것이다.
1) 이벤트를 보면 이벤트가 발생 했을 때 특정메소드만을 호출 하고 거기서 개발자가 원하는 동작을 하도록 코딩한다.
eTest.ckEvent += new eventDelegate(MainClass.click); //실제동작은 mainClass.click메소드이다.
이벤트로 인해 일반적으로 클래스가 아닌 특정한 때에 특정 메소드만을 호출 할 수 있는 먼가가 필요하게 되었다.
델리게이트는 c언어의 함수포인터와 같다고 할수 있다. c언어의 함수포인터가 왜 사용되는줄 알면 델리게이트는 c#에서 왜 사용되는지 알수 있을것 같다.
* 함수포인터 (c언어)
함수가 존재하는 메모리의 주소를 가리키는 특수한 변수
델리게이트 간단한사용법
-델리게이트 타입을 선언해주어야 한다.
-실행하고자 하는 코드가 담긴 메서드가 있어야한다.
-델리게이트 인스턴스를 생성해주어야 한다.
-델리게이트 인스턴스를 호출해주어야 한다.
대리자
대리자를 인스턴스화 하면 모든 메서드가 있는 인스턴스를 호환되는 시그니처(반환형식과 매개변수로 구성)에 연결 할 수 있습니다. 대리자 인스턴스를 통해 메서드를 호출할수 있습니다.
대리자는 메서드를 다른 메서드에 인수로 전달하는데 사용됩니다.
이벤트 처리기는 대리자를 통해 호출되는 메서드라고 할 수 있습니다. 사용자 지정 메서드를 만들면 windows 컨트롤 같은 클래스가 특정 이벤트가 발생했을때 해당 메서드를 호출 할 수 있습니다.
public delegate int PerformCalculation(int x, int y);
액세스 가능한 클래스 및 구조체를 반환형식과 매개변수 구성 만 맞는다면 모두 대리자에 할당 할 수 있습니다. 그리고 메서드의 반환값과 대리자의 반환값이 같아야 합니다.
c++의 함수포인터와 유사하지만 형식이 안전함
대리자를 통해 메서드를 매개변수로 전달 할 수 있음
대리자를 사용하여 콜백 메서드를 정의할 수 있음
여러대리자와 연결 할 수 있음
델리게이트 사용이유
특징적인 역할을 하는 함수(객체, 메소드등)를 특정한 조건이나 의도를 가지고 묶음으로 만들어내어 보다 간편하게 사용하도록 하는것 ,
또한 복잡한 객체를 상속하는것을 피하고, 메소드를 재정의 하지 않음으로써 보다 객체지향적인 프로그래밍을 할 수 있도록 도와줌
action A object A
action B 델리게이트 object B
aciont C object C
'C#' 카테고리의 다른 글
C# is와 as 차이점 사용법 (0) | 2012.09.14 |
---|---|
C# dll import 사용하기 (0) | 2012.09.13 |
C# 속성 1.1부터 4.0까지 소스로 구분해보쟈~!! (0) | 2012.08.30 |
C# 트래잭션및 com+트랜잰셕정리 (0) | 2012.08.22 |
C# com+ 디버깅방법 (0) | 2012.08.17 |