글
출처 : http://www.hoons.net/board/asptip/content/30981
- 위 출처에 나와있는 포스팅 내용을 요약하여 정리하였다.
먼저 들어가기 전 용어 정의.
<< Terminology >>
Method : 클래스에서 사용되어지는 함수 형태
Function : 일반 C언어나 Script 에서 사용되어지는 함수 형태
Function Pointer : 일반 C언어나 Script 에서 사용되어 지는 함수 포인터
위 포스팅한 분이 정리해놓은 Delegate 에 대해 정의하자면
- 특정한 때에 조건에 부합한 특정 클래스의 Method 를 실행
- 언제 무엇이 실행될 지 모를 때 사용하는 것
ex ) 유언장과 유언장을 집행하는 대리자
: 유언장에 죽은 후 해야 할 몇 가지 Method(유언) 들을 적어 놓고, 이 Method 들이 언제 실행될까?
정답은 '아무도 모른다'이다. 예를 들어 대리자 입장에서 유산이 얼마 없는데 백억을 후손에게 물려줘야 된다고
유언장에 적혀있다면 그 유언은 실행되지 않을 것이다. 즉, 조건이 맞아야 그 Method 를 실행시킬 수 있다.
위 예제를 다시 요약하면 패러미터 타입과 리턴 타입이 동일 + 성립된 조건 하에 어떤 Method 든지 실행이 가능하다.
특정한 때에.
=> 여기서 '이벤트'를 떠올린다.
delegate 선언을 보면,
delegate void SimpleDelegate();
밑줄 친 부분을 보면 클래스의 Method 로 보이고, C언어라면 함수의 형태를 띄고 있다고 할 수 있다.
But, 객체지향 언어는 클래스 기반이라 C언어에 있는 함수라는 게 존재하지 않아 위와 같은 형태로 사용하는 것은 불가능!
그런데...... "delegate 는 클래스처럼 인스턴스를 생성시킬 수 있다."
SimpleDelegate simpleDelegate = new SimpleDelegate();
클래스가 아님에도 하나의 함수가 마치 클래스처럼 동작한다는 점.
-> 왜 이렇게 동작을 시켜야 하는지, 필요한 이유가 무엇인지
: 이벤트로 인해 일반적으로 "클래스가 아닌 특정한 때에 특정 Method 만을 호출" 할 수 있는
무언가가 필요하기 때문. 그 무언가가 'delegate' 이다.
아래 예제를 보자.
eTest.ckEvent += new evnetDelegate(MainClass.Click);
이벤트가 발생해 특정 Method 만을 호출하고 그 Method 에 개발자가 원하는 동작을 하도록 코딩을 한다.
실제 동작하는 코드가 있는 Method 는 MainClass.Click 인데 이 경우 MainClass 에 대한 참조가 필요하다는 것이다.
클래스가 아닌 저 Click 이벤트 핸들러에서 정의된 메소드만 필요하건만,
객체지향 에서는 저 메소드 하나때문에 불가피하게 MainClass 를 생성할 수 밖에 없다는 거......
delegate 가 필요한 이유를 잘 읽어보면,
C 에서의 함수 포인터와 C# 의 delegate 는 사실상 같다고 볼 수 있다.
C에서의 함수 포인터란 ?
- 함수가 존재하는 메모리의 주소를 가리키는 특수한 변수. 또한 실행(호출)도 가능하다.
delegate 는 Method 를 실행시키고 함수포인터는 함수를 실행시킬 뿐 사실상 같은 역할을 하고 있다.
<< Delegate 사용법 >>
참고로 위 코드를 보면 알겠지만 Delegate 는 MainClass.Click 과 같이 일반화된 메소드 역시 참조할 수 있다.
또한 하나의 Delegate로 여러 개의 메소드를 동시에 참조할 수 있다 : Delegate.Combine()
그리고 Combine 된 참조를 해제할 수 도 있다 : Delegate.Remove() 또는 '-=' 연산자
Calculate calc;
calc = delegate(int a, int b){ return a + b; } // 이렇게 익명 메소드로도 사용할 수 있다.
delegate myDel = (int a, int b) => a+ b; // 람다식 사용도 가능
'Programming' 카테고리의 다른 글
언리얼엔진4 : DataTable 오브젝트 생성하기 (0) | 2014.09.22 |
---|---|
자료구조 : Linked List (0) | 2014.04.25 |
[Python, C#]Lambda Form (0) | 2013.12.19 |
PHP vs. Ruby vs. Python (0) | 2013.12.19 |
HTML5 Canvas Element 를 사용할 때 주의할점 - drawImage() 관련 (2) | 2013.01.11 |
RECENT COMMENT